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 <[email protected]>
Reviewed-by: Jérôme Duval <[email protected]>
This commit is contained in:
Jérôme Duval
2022-06-28 06:02:01 +00:00
parent 6c478b54f6
commit 1e68c512da
@@ -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