ldso: Fix RISC-V support with 21.05 tool chain

- force inlining of more functions
- force -O2 for RISC-V (even if -O0 is set globally)
- intialize cxx guard after self relocation

issue #4094
This commit is contained in:
Sebastian Sumpf 2021-05-07 12:54:45 +02:00 committed by Christian Helmuth
parent a6fe6c90d4
commit fd9bc43be1
3 changed files with 13 additions and 7 deletions

View File

@ -1,3 +1,9 @@
#
# Force to build -O2 on RISC-V in order to get proper inlining during self
# relocation
#
override CC_OLEVEL = -O2
include $(BASE_DIR)/lib/mk/ld-platform.inc include $(BASE_DIR)/lib/mk/ld-platform.inc
INC_DIR += $(DIR)/spec/riscv INC_DIR += $(DIR)/spec/riscv

View File

@ -179,7 +179,7 @@ class Linker::Dynamic
enum Pass { FIRST_PASS, SECOND_PASS }; enum Pass { FIRST_PASS, SECOND_PASS };
Dynamic(Dependency const &dep) Dynamic(Dependency const &dep) SELF_RELOC
: :
_dep(&dep), _obj(dep.obj()), _dynamic(*(Elf::Dyn *)dynamic_address()) _dep(&dep), _obj(dep.obj()), _dynamic(*(Elf::Dyn *)dynamic_address())
{ {
@ -339,7 +339,7 @@ class Linker::Dynamic
Plt_got r(*_dep, _pltgot); Plt_got r(*_dep, _pltgot);
} }
void relocate_non_plt(Bind bind, Pass pass) void relocate_non_plt(Bind bind, Pass pass) SELF_RELOC
{ {
if (_reloca) if (_reloca)
Reloc_non_plt r(*_dep, _reloca, _reloca_size, pass == SECOND_PASS); Reloc_non_plt r(*_dep, _reloca, _reloca_size, pass == SECOND_PASS);

View File

@ -127,7 +127,7 @@ class Linker::Elf_object : public Object, private Fifo<Elf_object>::Element
public: public:
Elf_object(Dependency const &dep, Object::Name const &name, Elf_object(Dependency const &dep, Object::Name const &name,
Elf::Addr reloc_base) Elf::Addr reloc_base) SELF_RELOC
: :
_elf_object_initialized(_object_init(name, reloc_base)), _elf_object_initialized(_object_init(name, reloc_base)),
_dyn(dep) _dyn(dep)
@ -261,7 +261,7 @@ class Linker::Elf_object : public Object, private Fifo<Elf_object>::Element
*/ */
struct Linker::Ld : private Dependency, Elf_object struct Linker::Ld : private Dependency, Elf_object
{ {
Ld() : Ld() SELF_RELOC :
Dependency(*this, nullptr), Dependency(*this, nullptr),
Elf_object(*this, linker_name(), relocation_address()) Elf_object(*this, linker_name(), relocation_address())
{ } { }
@ -651,9 +651,6 @@ Elf::Sym const *Linker::lookup_symbol(char const *name, Dependency const &dep,
*/ */
extern "C" void init_rtld() extern "C" void init_rtld()
{ {
/* init cxa guard mechanism before any local static variables are used */
init_cxx_guard();
/* /*
* Allocate on stack, since the linker has not been relocated yet, the vtable * Allocate on stack, since the linker has not been relocated yet, the vtable
* type relocation might produce a wrong vtable pointer (at least on ARM), do * type relocation might produce a wrong vtable pointer (at least on ARM), do
@ -662,6 +659,9 @@ extern "C" void init_rtld()
Ld linker_on_stack; Ld linker_on_stack;
linker_on_stack.relocate(BIND_LAZY); linker_on_stack.relocate(BIND_LAZY);
/* init cxa guard mechanism before any local static variables are used */
init_cxx_guard();
/* /*
* Create actual linker object with different vtable type and set PLT to new * Create actual linker object with different vtable type and set PLT to new
* DAG. * DAG.