[LLD] Is there any reason to add _GLOBAL_OFFSET_TABLE_ to .dynsym?

When LLD builds a shared library for x86_64 it puts
_GLOBAL_OFFSET_TABLE_ to the both .symtab and .dynsym and defines it
as a GLOBAL symbol. If later this shared library participates in
executable file linking and GNU BFD linked is used for that, this
linker shows an error:

/usr/bin/ld: a.out: hidden symbol `_GLOBAL_OFFSET_TABLE_' in
/usr/lib/x86_64-linux-gnu/crt1.o is referenced by DSO

Gold linker does not show any error, but it is anyway strange that we
make _GLOBAL_OFFSET_TABLE_ globally visible and add it to dynamic
symbol table.

Both BFD and Gold linker do not put _GLOBAL_OFFSET_TABLE_ to the
dynamic symbol table and defines this symbol as follows:

BFD:
Num: Value Size Type Bind Vis Ndx Name
42: 0000000000200990 0 OBJECT LOCAL DEFAULT ABS _GLOBAL_OFFSET_TABLE_

Gold:
Num: Value Size Type Bind Vis Ndx Name
19: 0000000000001a18 40 OBJECT LOCAL HIDDEN 19 _GLOBAL_OFFSET_TABLE_

I think that there’s no reason to add that symbol to .dynsym. If it is causing a problem, we should remove that.

It shouldn't put it into .dynsym. It can be useful in .symtab for
debugging purposes.

Joerg

How is it used, btw?

To me it looked to be a gas hack that became visible. R_386_GOTPC and
similar should be able to just use an r_sym of 0, no?

But in lld we have to handle current files with _GLOBAL_OFFSET_TABLE_,
and yes, no objections do dropping it from any table.

Cheers,
Rafael