1da0c48c4Sopenharmony_ciFundamental design decision: 2da0c48c4Sopenharmony_ci 3da0c48c4Sopenharmony_ci- the sizes of external and internal types are assumed to be the same. 4da0c48c4Sopenharmony_ci This leaves byte ordering aside. While assuming this the code can be 5da0c48c4Sopenharmony_ci greatly simplified and speed increases. Since no change violating this 6da0c48c4Sopenharmony_ci assumption is in sight this is believed to be a worthwhile optimization. 7da0c48c4Sopenharmony_ci 8da0c48c4Sopenharmony_ci- the ABI of the backend modules is not guaranteed. Really, no guarantee 9da0c48c4Sopenharmony_ci whatsoever. We are enforcing this in the code. The modules and their 10da0c48c4Sopenharmony_ci users must match. No third-party EBL module are supported or allowed. 11da0c48c4Sopenharmony_ci The only reason there are separate modules is to not have the code for 12da0c48c4Sopenharmony_ci all architectures in all the binaries. 13da0c48c4Sopenharmony_ci 14da0c48c4Sopenharmony_ci- although the public libraries (libasm, libdw) have a stable API and are 15da0c48c4Sopenharmony_ci backwards ABI compatible they, and the elfutils tools, do depend on each 16da0c48c4Sopenharmony_ci others internals, and on internals of libelf to provide their interfaces. 17da0c48c4Sopenharmony_ci So they should always be upgraded in lockstep when packaging the tools 18da0c48c4Sopenharmony_ci and libraries separately. For one example of how to do that, see the 19da0c48c4Sopenharmony_ci config/elfutils.spec. 20da0c48c4Sopenharmony_ci 21da0c48c4Sopenharmony_ciSome notes: 22da0c48c4Sopenharmony_ci 23da0c48c4Sopenharmony_ci- old GNU ld's behavior wrt DSOs seems to be severely broken. 24da0c48c4Sopenharmony_ci 25da0c48c4Sopenharmony_ci y.o reference foo() 26da0c48c4Sopenharmony_ci y1.o defines foo(), references bar() 27da0c48c4Sopenharmony_ci y2.o defines bar() 28da0c48c4Sopenharmony_ci libbar.so defines bar() 29da0c48c4Sopenharmony_ci 30da0c48c4Sopenharmony_ci Running 31da0c48c4Sopenharmony_ci 32da0c48c4Sopenharmony_ci gcc -o y y.o -lbar y1.o y2.o 33da0c48c4Sopenharmony_ci 34da0c48c4Sopenharmony_ci uses the bar() definition from libbar.so and does not mention the definition 35da0c48c4Sopenharmony_ci in y2.o at all (no duplicate symbol message). Correct is to use the 36da0c48c4Sopenharmony_ci definition in y2.o. 37da0c48c4Sopenharmony_ci 38da0c48c4Sopenharmony_ci 39da0c48c4Sopenharmony_ci y.o reference foo() 40da0c48c4Sopenharmony_ci y1.o defines foo(), references bar() 41da0c48c4Sopenharmony_ci y2.o in liby2.a defines bar() 42da0c48c4Sopenharmony_ci libbar.so defines bar() 43da0c48c4Sopenharmony_ci 44da0c48c4Sopenharmony_ci Running 45da0c48c4Sopenharmony_ci 46da0c48c4Sopenharmony_ci gcc -o y y.o -lbar y1.o -ly3 47da0c48c4Sopenharmony_ci 48da0c48c4Sopenharmony_ci has to use the definition in -lbar and not pull the definition from liby3.a. 49da0c48c4Sopenharmony_ci 50da0c48c4Sopenharmony_ci 51da0c48c4Sopenharmony_ci- the old linker follows DT_NEEDED entries and adds the objects referenced 52da0c48c4Sopenharmony_ci this way which define a symbol which is needed as a DT_NEEDED to the 53da0c48c4Sopenharmony_ci generated binary. This is wrong since the DT_NEEDED changes the search 54da0c48c4Sopenharmony_ci path in the object (which is breadth first). 55da0c48c4Sopenharmony_ci 56da0c48c4Sopenharmony_ci 57da0c48c4Sopenharmony_ci- the old linker supported extern "C++", extern "java" in version scripts. 58da0c48c4Sopenharmony_ci I believe this implementation is severely broken and needs a redesign 59da0c48c4Sopenharmony_ci (how do wildcards work with these languages*?). Therefore it is left 60da0c48c4Sopenharmony_ci out for now. 61da0c48c4Sopenharmony_ci 62da0c48c4Sopenharmony_ci 63da0c48c4Sopenharmony_ci- what should happen if two sections in different files with the same 64da0c48c4Sopenharmony_ci name have different types and/or the flags are different 65da0c48c4Sopenharmony_ci 66da0c48c4Sopenharmony_ci 67da0c48c4Sopenharmony_ci- section names in input files are mostly irrelevant. Exceptions: 68da0c48c4Sopenharmony_ci 69da0c48c4Sopenharmony_ci .comment/SHT_PROGBITS in strip, ld 70da0c48c4Sopenharmony_ci 71da0c48c4Sopenharmony_ci .debug \ 72da0c48c4Sopenharmony_ci .line | 73da0c48c4Sopenharmony_ci .debug_srcinfo | 74da0c48c4Sopenharmony_ci .debug_sfnames | 75da0c48c4Sopenharmony_ci .debug_aranges | 76da0c48c4Sopenharmony_ci .debug_pubnames | 77da0c48c4Sopenharmony_ci .debug_info | 78da0c48c4Sopenharmony_ci .debug_abbrev | 79da0c48c4Sopenharmony_ci .debug_line | 80da0c48c4Sopenharmony_ci .debug_abbrev > DWARF sections in ld 81da0c48c4Sopenharmony_ci .debug_line | 82da0c48c4Sopenharmony_ci .debug_frame | 83da0c48c4Sopenharmony_ci .debug_str | 84da0c48c4Sopenharmony_ci .debug_loc | 85da0c48c4Sopenharmony_ci .debug_macinfo | 86da0c48c4Sopenharmony_ci .debug_weaknames | 87da0c48c4Sopenharmony_ci .debug_funcnames | 88da0c48c4Sopenharmony_ci .debug_typenames | 89da0c48c4Sopenharmony_ci .debug_varnames / 90da0c48c4Sopenharmony_ci 91da0c48c4Sopenharmony_ci Sections created in output files follow the naming of special section 92da0c48c4Sopenharmony_ci from the gABI. 93da0c48c4Sopenharmony_ci 94da0c48c4Sopenharmony_ci In no place is a section solely identified by its name. Internal 95da0c48c4Sopenharmony_ci references always use the section index. 96