| Fundamental design decision: |
| |
| - the sizes of external and internal types are assumed to be the same. |
| This leaves byte ordering aside. While assuming this the code can be |
| greatly simplified and speed increases. Since no change violating this |
| assumption is in sight this is believed to be a worthwhile optimization. |
| |
| - the ABI of the backend modules is not guaranteed. Really, no guarantee |
| whatsoever. We are enforcing this in the code. The modules and their |
| users must match. No third-party EBL module are supported or allowed. |
| The only reason there are separate modules is to not have the code for |
| all architectures in all the binaries. |
| |
| - although the public libraries (libasm, libdw) have a stable API and are |
| backwards ABI compatible they, and the elfutils tools, do depend on each |
| others internals, and on internals of libelf to provide their interfaces. |
| So they should always be upgraded in lockstep when packaging the tools |
| and libraries separately. For one example of how to do that, see the |
| config/elfutils.spec. |
| |
| Some notes: |
| |
| - old GNU ld's behavior wrt DSOs seems to be severely broken. |
| |
| y.o reference foo() |
| y1.o defines foo(), references bar() |
| y2.o defines bar() |
| libbar.so defines bar() |
| |
| Running |
| |
| gcc -o y y.o -lbar y1.o y2.o |
| |
| uses the bar() definition from libbar.so and does not mention the definition |
| in y2.o at all (no duplicate symbol message). Correct is to use the |
| definition in y2.o. |
| |
| |
| y.o reference foo() |
| y1.o defines foo(), references bar() |
| y2.o in liby2.a defines bar() |
| libbar.so defines bar() |
| |
| Running |
| |
| gcc -o y y.o -lbar y1.o -ly3 |
| |
| has to use the definition in -lbar and not pull the definition from liby3.a. |
| |
| |
| - the old linker follows DT_NEEDED entries and adds the objects referenced |
| this way which define a symbol which is needed as a DT_NEEDED to the |
| generated binary. This is wrong since the DT_NEEDED changes the search |
| path in the object (which is breadth first). |
| |
| |
| - the old linker supported extern "C++", extern "java" in version scripts. |
| I believe this implementation is severely broken and needs a redesign |
| (how do wildcards work with these languages*?). Therefore it is left |
| out for now. |
| |
| |
| - what should happen if two sections in different files with the same |
| name have different types and/or the flags are different |
| |
| |
| - section names in input files are mostly irrelevant. Exceptions: |
| |
| .comment/SHT_PROGBITS in strip, ld |
| |
| .debug \ |
| .line | |
| .debug_srcinfo | |
| .debug_sfnames | |
| .debug_aranges | |
| .debug_pubnames | |
| .debug_info | |
| .debug_abbrev | |
| .debug_line | |
| .debug_abbrev > DWARF sections in ld |
| .debug_line | |
| .debug_frame | |
| .debug_str | |
| .debug_loc | |
| .debug_macinfo | |
| .debug_weaknames | |
| .debug_funcnames | |
| .debug_typenames | |
| .debug_varnames / |
| |
| Sections created in output files follow the naming of special section |
| from the gABI. |
| |
| In no place is a section solely identified by its name. Internal |
| references always use the section index. |