mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-30 08:41:15 +00:00
LibELF: Support weak symbols when using BIND_NOW
When using BIND_NOW (e.g. via -Wl,-z,now) we would fail to load ELF images while doing relocations when we encounter a weak symbol. Instead we should just patch the PLT entry with a null pointer. This can be reproduced with: $ cat test.cpp int main() { std::cout << "Hello World!" << std::endl; } $ g++ -o test -Wl,-z,now test.cpp $ ./test did not find symbol while doing relocations for library test: _ITM_RU1
This commit is contained in:
parent
26cb64573c
commit
73b9cfac1b
Notes:
sideshowbarker
2024-07-18 17:07:51 +09:00
Author: https://github.com/gunnarbeutner Commit: https://github.com/SerenityOS/serenity/commit/73b9cfac1b4 Pull-request: https://github.com/SerenityOS/serenity/pull/7623
|
@ -454,13 +454,15 @@ VirtualAddress DynamicObject::patch_plt_entry(u32 relocation_offset)
|
|||
auto symbol = relocation.symbol();
|
||||
u8* relocation_address = relocation.address().as_ptr();
|
||||
|
||||
VirtualAddress symbol_location;
|
||||
auto result = DynamicLoader::lookup_symbol(symbol);
|
||||
if (!result.has_value()) {
|
||||
if (result.has_value()) {
|
||||
symbol_location = result.value().address;
|
||||
} else if (symbol.bind() != STB_WEAK) {
|
||||
dbgln("did not find symbol while doing relocations for library {}: {}", m_filename, symbol.name());
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
|
||||
auto symbol_location = result.value().address;
|
||||
dbgln_if(DYNAMIC_LOAD_DEBUG, "DynamicLoader: Jump slot relocation: putting {} ({}) into PLT at {}", symbol.name(), symbol_location, (void*)relocation_address);
|
||||
|
||||
*(FlatPtr*)relocation_address = symbol_location.get();
|
||||
|
|
Loading…
Reference in a new issue