hrev56220 adds 1 changeset to branch 'master'
old head: 6c478b54f65d618f528b9b8b747c5e80d4d2bc95
new head: 1e68c512dab5b5601325479cdd9b0a533763cbb1
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=1e68c512dab5+%5E6c478b54f65d
----------------------------------------------------------------------------
1e68c512dab5: runtime_loader: accept type STT_FUNC when STT_OBJECT is requested
trying to load a PIE executable produced by golang show the following (for
pthread_create)
12: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND pthread_create
12655: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND pthread_create
It's the same for Linux or Solaris, so I suppose we're being too picky.
Change-Id: Ibe817c231365aba8b2eb88eb3f556d2bd1db384a
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5392
Tested-by: Commit checker robot <no-reply+buildbot@xxxxxxxxxxxx>
Reviewed-by: Jérôme Duval <jerome.duval@xxxxxxxxx>
[ Jérôme Duval <jerome.duval@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev56220
Commit: 1e68c512dab5b5601325479cdd9b0a533763cbb1
URL: https://git.haiku-os.org/haiku/commit/?id=1e68c512dab5
Author: Jérôme Duval <jerome.duval@xxxxxxxxx>
Date: Tue Jun 21 12:22:43 2022 UTC
----------------------------------------------------------------------------
1 file changed, 4 insertions(+), 5 deletions(-)
src/system/runtime_loader/elf_symbol_lookup.cpp | 9 ++++-----
----------------------------------------------------------------------------
diff --git a/src/system/runtime_loader/elf_symbol_lookup.cpp
b/src/system/runtime_loader/elf_symbol_lookup.cpp
index 4a46c6be99..a63b7ea3c7 100644
--- a/src/system/runtime_loader/elf_symbol_lookup.cpp
+++ b/src/system/runtime_loader/elf_symbol_lookup.cpp
@@ -127,7 +127,7 @@ find_symbol(image_t* image, const SymbolLookupInfo&
lookupInfo, bool allowLocal)
uint32 type = symbol->Type();
if ((lookupInfo.type == B_SYMBOL_TYPE_TEXT && type !=
STT_FUNC)
|| (lookupInfo.type == B_SYMBOL_TYPE_DATA
- && type != STT_OBJECT)) {
+ && type != STT_OBJECT && type !=
STT_FUNC)) {
continue;
}
@@ -495,8 +495,6 @@ resolve_symbol(image_t* rootImage, image_t* image, elf_sym*
sym,
int32 type = B_SYMBOL_TYPE_ANY;
if (sym->Type() == STT_FUNC)
type = B_SYMBOL_TYPE_TEXT;
- else if (sym->Type() == STT_OBJECT)
- type = B_SYMBOL_TYPE_DATA;
if (sym->Bind() == STB_LOCAL) {
// Local symbols references are always resolved to the given
symbol.
@@ -537,8 +535,9 @@ resolve_symbol(image_t* rootImage, image_t* image, elf_sym*
sym,
sharedImage = NULL;
}
} else if (sym->Type() != STT_NOTYPE
- && sym->Type() != sharedSym->Type()) {
- // symbol not of the requested type
+ && sym->Type() != sharedSym->Type()
+ && (sym->Type() != STT_OBJECT || sharedSym->Type() !=
STT_FUNC)) {
+ // symbol not of the requested type, except object which can
match function
lookupError = ERROR_WRONG_TYPE;
sharedImage = NULL;
} else if (sharedSym->Bind() != STB_GLOBAL