------- Comment #26 from amodra at bigpond dot net dot au  2007-10-31 04:03 
-------
I believe the linker is correct to reject relocations against local symbols in
discarded sections.  The reason being that the linker allows linkonce (and
comdat group) section contents to differ between two files, so that for
example, two files may be compiled with different optimisations yet still link
correctly.  Since the contents may differ, the location of symbols within the
section may also differ between files.  Using the value of "local_sym + offset"
in one file (in the discarded section) may point to an entirely wrong location
in the other file (in the kept section).

You could argue that the linker ought to look up the value of "local_sym" in
the file with the kept section, but relocations against local symbols are often
reduced to relocations against section symbols, so the original "local_sym" is
lost.

The situation is different with global symbols because globals are merged.  The
definition in the kept section will be used for all relocations.

I hope this answers Geoff's remark "ld refuses to link your program for no good
reason".


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33871

Reply via email to