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