On Sun, May 23, 2010 at 9:17 AM, Carlos O'Donell <carlos@systemhalted.org> wrote: > I am still analyzing (3), (4) and (5) which appears to be related. A bit of background... In glibc/elf/dl-fptr.c the global variable "local" references itself by taking the address of &local.boot_table. Computing the address of a global variable requires a relocation because the address of the program data is not known at link time (it will be relocated somewhere by the dynamic linker). However, there is a chicken-and-egg problem here. The problem leads to segfaults under certain conditions when relocations are ordered in a certain way (you will see later why). The hppa and ia64 ports use this code to create official procedure descriptors (OPDs) when processing OPD relocations e.g. R_PARISC_PLABLE32. By requiring a relocation to setup the global variable "local", it effectively requires that this particular relocation (the one to compute the address of &local.boot_table) be processed *before* any R_PARISC_PLABEL32 relocations. If you don't process the relocation for &local.boot_table first you haven't initialized all of local, and making a OPD may segfault. It is possible that this could be fixed by sorting the relocations in the linker (sort all non-OPD relocs before OPC relocs), but requiring sorted relocations is a fragile solution. The best solution is to remove the static initialization of that structure member when compiling SHARED. This is what the current debian/patches/hppa/local-_dl_fptr_init.diff does in eglibc-2.11. However, the patch overlooked the non-SHARED case, and this caused the regressions in tststatic, tststatic2, and tst-tls9-static. Aurelien, The following patch is a lightly-tested (I built each test by hand and verified they worked) update which implements the non-SHARED (static linking) case. Could you give the attached patch a try and tell me how the test results look? Please replace local-_dl_fptr_init.diff and local-ELF_MACHINE_BEFORE_RTLD_RELOC.diff with the attached patch and test. I'm running my own test run, but I would like to be able to compare results. That completes the 5 regressions that hppa currently has: (1) tstdiomisc - Mark as expected fail until the compiler is fixed. (2) tst-vfork1 - Kernel issue, mark this and tst-vfork2 as expected fail until the kernel is fixed (3) tststatic - Fixed by attached patch. (4) tststatic2 - Likewise. (5) tst-tls9-static - Likewise. Cheers, Carlos.
Attachment:
dlfptr-all.diff
Description: Binary data