From ac702ffd218190d1de5e6909e89e2ea842ada954 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 23 Jul 2024 17:40:58 -0400 Subject: [PATCH] Revert "runtime_loader: allow the ABI version symbol to be local." This reverts commit 61987fe7a257b47c4e7be4dc4f941c3105adf38d. The original commit had a typo in it preventing this logic from working (the "true" should be after the first ")".) It ultimately doesn't seem to be needed, and just complicates the ELF lookup logic. Change-Id: I23df8c86ad61cac4db45af2ae4ab69635a9e4a33 Reviewed-on: https://review.haiku-os.org/c/haiku/+/7852 Reviewed-by: waddlesplash --- src/system/runtime_loader/elf_haiku_version.cpp | 3 ++- src/system/runtime_loader/elf_symbol_lookup.cpp | 16 +++------------- src/system/runtime_loader/elf_symbol_lookup.h | 3 +-- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/system/runtime_loader/elf_haiku_version.cpp b/src/system/runtime_loader/elf_haiku_version.cpp index 97fbed4073..855ddce6a7 100644 --- a/src/system/runtime_loader/elf_haiku_version.cpp +++ b/src/system/runtime_loader/elf_haiku_version.cpp @@ -216,9 +216,10 @@ analyze_image_haiku_version_and_abi(int fd, image_t* image, elf_ehdr& eheader, // Haiku API version elf_sym* symbol = find_symbol(image, SymbolLookupInfo(B_SHARED_OBJECT_HAIKU_VERSION_VARIABLE_NAME, - B_SYMBOL_TYPE_DATA, true)); + B_SYMBOL_TYPE_DATA)); if (symbol != NULL && symbol->st_shndx != SHN_UNDEF && symbol->st_value > 0 + && symbol->Type() == STT_OBJECT && symbol->st_size >= sizeof(uint32)) { image->api_version = *(uint32*)(symbol->st_value + image->regions[0].delta); diff --git a/src/system/runtime_loader/elf_symbol_lookup.cpp b/src/system/runtime_loader/elf_symbol_lookup.cpp index a63b7ea3c7..04d289ce24 100644 --- a/src/system/runtime_loader/elf_symbol_lookup.cpp +++ b/src/system/runtime_loader/elf_symbol_lookup.cpp @@ -93,19 +93,8 @@ patch_undefined_symbol(image_t* rootImage, image_t* image, const char* name, } -static bool -is_symbol_visible(elf_sym* symbol) -{ - if (symbol->Bind() == STB_GLOBAL) - return true; - if (symbol->Bind() == STB_WEAK) - return true; - return false; -} - - elf_sym* -find_symbol(image_t* image, const SymbolLookupInfo& lookupInfo, bool allowLocal) +find_symbol(image_t* image, const SymbolLookupInfo& lookupInfo) { if (image->dynamic_ptr == 0) return NULL; @@ -120,7 +109,8 @@ find_symbol(image_t* image, const SymbolLookupInfo& lookupInfo, bool allowLocal) elf_sym* symbol = &image->syms[i]; if (symbol->st_shndx != SHN_UNDEF - && (allowLocal || is_symbol_visible(symbol)) + && ((symbol->Bind() == STB_GLOBAL) + || (symbol->Bind() == STB_WEAK)) && !strcmp(SYMNAME(image, symbol), lookupInfo.name)) { // check if the type matches diff --git a/src/system/runtime_loader/elf_symbol_lookup.h b/src/system/runtime_loader/elf_symbol_lookup.h index b82a2fe3f6..ec7239d90e 100644 --- a/src/system/runtime_loader/elf_symbol_lookup.h +++ b/src/system/runtime_loader/elf_symbol_lookup.h @@ -132,8 +132,7 @@ void patch_undefined_symbol(image_t* rootImage, image_t* image, const char* name, image_t** foundInImage, void** symbol, int32* type); -elf_sym* find_symbol(image_t* image, const SymbolLookupInfo& lookupInfo, - bool allowLocal = false); +elf_sym* find_symbol(image_t* image, const SymbolLookupInfo& lookupInfo); status_t find_symbol(image_t* image, const SymbolLookupInfo& lookupInfo, void** _location); status_t find_symbol_breadth_first(image_t* image,