diff --git a/repos/base/lib/mk/spec/riscv/ld-platform.inc b/repos/base/lib/mk/spec/riscv/ld-platform.inc index e06b12aab7..02b3b26fea 100644 --- a/repos/base/lib/mk/spec/riscv/ld-platform.inc +++ b/repos/base/lib/mk/spec/riscv/ld-platform.inc @@ -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 INC_DIR += $(DIR)/spec/riscv diff --git a/repos/base/src/lib/ldso/include/dynamic.h b/repos/base/src/lib/ldso/include/dynamic.h index 442b8c667e..8bfafe00d5 100644 --- a/repos/base/src/lib/ldso/include/dynamic.h +++ b/repos/base/src/lib/ldso/include/dynamic.h @@ -179,7 +179,7 @@ class Linker::Dynamic 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()) { @@ -339,7 +339,7 @@ class Linker::Dynamic 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) Reloc_non_plt r(*_dep, _reloca, _reloca_size, pass == SECOND_PASS); diff --git a/repos/base/src/lib/ldso/main.cc b/repos/base/src/lib/ldso/main.cc index 5006c3ef91..1b3d9d2906 100644 --- a/repos/base/src/lib/ldso/main.cc +++ b/repos/base/src/lib/ldso/main.cc @@ -127,7 +127,7 @@ class Linker::Elf_object : public Object, private Fifo::Element public: 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)), _dyn(dep) @@ -261,7 +261,7 @@ class Linker::Elf_object : public Object, private Fifo::Element */ struct Linker::Ld : private Dependency, Elf_object { - Ld() : + Ld() SELF_RELOC : Dependency(*this, nullptr), 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() { - /* 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 * 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; 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 * DAG.