Adhemerval Zanella
2015-Jun-23 19:37 UTC
[LLVMdev] [lld] Regression with init_array for clang
Hi, Checking the llvm test-suite with latest clang/lld I noticed some regressions on both x86_64 and aarch64. Tracking down I found it is due 'ldd' not being handling correct the init_array segments for some cases. For instance the code: global_ctor.cpp: #include <stdio.h> //extern int printf(const char *, ...); int CN = 0; int DN = 0; struct foo { int Num; foo(int num) : Num(num) { printf("Foo ctor %d %d\n", Num, CN++); } ~foo() { printf("Foo dtor %d %d\n", Num, DN++); } } Constructor1(7); // Global with ctor to be called before main foo Constructor2(12); struct bar { ~bar() { printf("bar dtor\n"); } } Destructor1; // Global with dtor int main() { printf("main\n"); return 0; } GCC 4.9 generates: Section Headers: [...] [15] .init_array INIT_ARRAY 0000000000000000 000001c0 0000000000000008 0000000000000000 WA 0 0 8 [...] Symbol table '.symtab' contains 37 entries: [...] 11: 0000000000000000 0 SECTION LOCAL DEFAULT 15 [...] While clang (trunk): [...] [18] .init_array INIT_ARRAY 0000000000000000 00000270 0000000000000008 0000000000000000 WA 0 0 8 [...] Main difference is clang is not adding the init_array symbol in .symtab. This makes ldd ignore the object section in ELFFile<ELFT>::createSymbolsFromAtomizableSections and thus not updating the init_array in final executable with object's init_array (and not triggering the object constructors). Now, the question is if this is a clang regression (since the test-suite was not failing two weeks ago), or it is something ldd should handle (since ld/gold handles it correctly). Also for 'ldd' which would be best strategy to handle such case: create a empty section atom (createSectionAtom(...)) if some 'runtime' segments are present (init_array, etc.)?