This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
> Note that i386-linux glibc build segfaults in ld.so ATM too (while > i686-linux works), both using gcc 3.2. In that case it seems like > %ebx was not set up as early as needed before _dl_start first references it. I cannot reproduce this with my gcc (3.2-0.2 maybe?) using -O1 -march=i386 but did with -O3 -march=i386. I think it is just happenstance that this did not bite before (if it did not) and is not related to the DONT_USE_BOOTSTRAP_MAP changes per se. I think it bites i386 because HP_TIMING_AVAIL is not defined and so the `start_time' reference in the beginning of _dl_start never happens. Without that reference, the compiler doesn't think it needs to have set up the GOT register by the time the elf_machine_load_address code presumes it's there. I added a hack to the asm in elf_machine_load_address to fool the compiler into thinking there is a global variable reference, and that fixed it so it doesn't crash any more. However, I am concerned that the presumptions about %ebx in dl-machine.h (elf_machine_load_address and elf_machine_dynamic) may bite us again at some point. If _dl_start makes no calls through the PLT, the compiler no longer necessarily uses %ebx for the GOT register. If we added more attribute_hidden or hidden_proto decls for _dl_* as we probably should, there would in fact be no PLT calls. I have been experimenting a little just now and I think we can arrange for the compiler to emit this code for us and avoid the register assumption. For elf_machine_dynamic I think a plain reference to _DYNAMIC should be fine, right? _DYNAMIC@GOT just produces 0. For elf_machine_load_address, I have gotten the compiler to reproduce the same pair of instructions (actually, when scheduling for i686 it decides that three are better than two) by using a pair of decls: extern char foobar __attribute__ ((visibility ("hidden"))); extern char foobar_x asm ("foobar"); int foo (void) { return &foobar - &foobar_x; }
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |