From 1e68c512dab5b5601325479cdd9b0a533763cbb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Tue, 21 Jun 2022 14:22:43 +0200 Subject: [PATCH] runtime_loader: accept type STT_FUNC when STT_OBJECT is requested MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Jérôme Duval --- src/system/runtime_loader/elf_symbol_lookup.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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