On Thu, Feb 16, 2012 at 1:32 AM, Richard Guenther
<richard.guent...@gmail.com> wrote:
> On Wed, Feb 15, 2012 at 6:09 PM, Rainer Orth
> <r...@cebitec.uni-bielefeld.de> wrote:
>> Paolo Bonzini <bonz...@gnu.org> writes:
>>
>>> This must be a separate macro in acinclude.m4 that is AC_REQUIREd from
>>> gcc_AC_INITFINI_ARRAY.
>>
>> Here's an updated patch that does so.  During testing, I found one
>> additional complication, though.  With the Sun as/GNU ld combination on
>> Solaris 11/x86, after the bootstrap had completed, all programs linked
>> against libgcc_s.so.1 SEGVed with a stacktrace like this:
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> [Switching to Thread 1 (LWP 1)]
>> 0x00002000 in ?? ()
>> (gdb) where
>> #0  0x00002000 in ?? ()
>> #1  0xfefcd73f in call_array () from /usr/lib/ld.so.1
>> #2  0xfefcd8bd in call_init () from /usr/lib/ld.so.1
>> #3  0xfefcc8e1 in setup () from /usr/lib/ld.so.1
>> #4  0xfefdcfd8 in _setup () from /usr/lib/ld.so.1
>> #5  0xfefc0674 in _rt_boot () from /usr/lib/ld.so.1
>> #6  0x0804796c in ?? ()
>> #7  0x08047ab0 in ?? ()
>> Backtrace stopped: previous frame inner to this frame (corrupt stack?)
>>
>> The problem turned out to be that with
>>
>>        .section        .init_array
>>
>> as generates
>>
>> Section Header[5]:  sh_name: .init_array
>>    sh_addr:      0               sh_flags:   0
>>    sh_size:      0x4             sh_type:    [ SHT_PROGBITS ]
>>    sh_offset:    0x344           sh_entsize: 0
>>    sh_link:      0               sh_info:    0
>>    sh_addralign: 0x4
>>
>> i.e. empty sh_flags.  gld seems to mishandle this, since the
>> corresponding .initarray entry is bad, as can be seen with runtime
>> linker debugging:
>>
>> $ LD_DEBUG=init LD_PRELOAD=./libgcc_s.so.1 ls
>> [...]
>> 02032: 1: calling .initarray[0]:0xfed77100: ./libgcc_s.so.1
>> 02032: 1: calling .initarray[1]:0x2000: ./libgcc_s.so.1
>> Segmentation Fault
>>
>> If I change the above to
>>
>>        .section        .init_array,"aw",@progbits
>>
>> everything works fine with as/gld, but breaks again with gas/gld since
>> gas warns about @progbits here.  It turned out that
>>
>>        .section        .init_array,"aw"
>>
>> is fine with both assemblers, while as doesn't understand @init_array.
>> That's what the patch below uses.
>>
>>> Can you test Linux too?  The change of -e0 looks good, but I'd rather check
>>> on the actual system.
>>
>> This patch has been bootstrapped on i386-pc-solaris2.{8, 9, 10, 11} with
>> as/ld, gas/ld and gas/gld, i386-pc-solaris2.11 with as/gld, as well as
>> x86_64-unknown-linux-gnu, correctly detecting .init_array etc. support
>> on the gld configurations.  It was also included with
>> sparc-sun-solaris2.* bootstraps, but even with gas/gld the configure
>> test fails.  I've got to investigate that separately.
>
> I'm not sure about the varasm.c change - it's definitely not a no-op
> (callback will be not set, and the flags will be different).  Certainly
> the current code is inconsistent wrt the priority != DEFAULT_INIT_PRIORITY
> case, not sure why, but you don't make it consistent either because
> you don't change that case to SECTION_NOTYPE either.  I'd be fine
> with it with both calls using SECTION_NOTYPE, but would like to
> know what the callback difference is about.
>
> HJ, can you shed some light on this?
>

GNU assembler understands:

.section        .init_array*

If Solaris assembler doesn't, I don't know how it will work
with .init_array with priority.


-- 
H.J.

Reply via email to