From 98f59fb96c80bb8664e0931eaead9c70898ed5a5 Mon Sep 17 00:00:00 2001 From: athenian200 Date: Sat, 11 Nov 2023 10:39:42 -0600 Subject: Issue #1824 - Use elfdump on SunOS instead of readelf. GNU readelf isn't available as consistently as I assumed across SunOS, and it can be named different things on different illumos distros (some call it readelf, others call it greadelf, etc), so it's safer to use elfdump. This is a fairly easy fix, just kind of annoying. --- config/config.mk | 8 +++++++- toolkit/library/dependentlibs.py | 22 +++++++++++++++++++++- toolkit/library/libxul.mk | 9 ++++++++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/config/config.mk b/config/config.mk index 2029889728..b254490ae6 100644 --- a/config/config.mk +++ b/config/config.mk @@ -526,8 +526,14 @@ EXPAND_MKSHLIB_ARGS += --symbol-order $(SYMBOL_ORDER) endif EXPAND_MKSHLIB = $(EXPAND_LIBS_EXEC) $(EXPAND_MKSHLIB_ARGS) -- $(MKSHLIB) +ifeq ($(OS_ARCH),SunOS) +ELF_TEST = elfdump -N .dynamic $(1) +else +ELF_TEST = $(TOOLCHAIN_PREFIX)readelf -d $(1) +endif + ifeq (,$(filter $(OS_TARGET),WINNT Darwin)) -CHECK_TEXTREL = @$(TOOLCHAIN_PREFIX)readelf -d $(1) | grep TEXTREL > /dev/null && echo 'TEST-UNEXPECTED-FAIL | check_textrel | We do not want text relocations in libraries and programs' || true +CHECK_TEXTREL = @$(ELF_TEST) | grep TEXTREL > /dev/null && echo 'TEST-UNEXPECTED-FAIL | check_textrel | We do not want text relocations in libraries and programs' || true endif define CHECK_BINARY diff --git a/toolkit/library/dependentlibs.py b/toolkit/library/dependentlibs.py index f2135d7c30..958fe5ef1d 100644 --- a/toolkit/library/dependentlibs.py +++ b/toolkit/library/dependentlibs.py @@ -50,6 +50,23 @@ def dependentlibs_mingw_objdump(lib): proc.wait() return deps +def dependentlibs_elfdump(lib): + '''Returns the list of dependencies declared in the given ELF .so''' + proc = subprocess.Popen(['elfdump', '-N', '.dynamic', lib], stdout = subprocess.PIPE) + deps = [] + for line in proc.stdout: + # Each line has the following format: + # index TYPE tag value + tmp = line + if len(tmp) > 3 and 'NEEDED' in tmp: + # NEEDED lines look like: + # [1] NEEDED 0x0000001 libname + match = re.search(r'(lib\w+.so.*)', tmp) + if match: + deps.append(match.group(1)) + proc.wait() + return deps + def dependentlibs_readelf(lib): '''Returns the list of dependencies declared in the given ELF .so''' proc = subprocess.Popen([substs.get('TOOLCHAIN_PREFIX', '') + 'readelf', '-d', lib], stdout = subprocess.PIPE) @@ -118,7 +135,10 @@ def dependentlibs(lib, libpaths, func): def gen_list(output, lib): libpaths = [os.path.join(substs['DIST'], 'bin')] binary_type = get_type(lib) - if binary_type == ELF: + if substs['OS_ARCH'] == 'SunOS': + # If we're on SunOS, we're using ELF, but can't rely on readelf. + func = dependentlibs_elfdump + elif binary_type == ELF: func = dependentlibs_readelf elif binary_type == MACHO: func = dependentlibs_otool diff --git a/toolkit/library/libxul.mk b/toolkit/library/libxul.mk index 7b18c1f7e5..0636fcd400 100644 --- a/toolkit/library/libxul.mk +++ b/toolkit/library/libxul.mk @@ -37,6 +37,13 @@ endif LOCAL_CHECKS = test "$$($(get_first_and_last) | xargs echo)" != "start_kPStaticModules_NSModule end_kPStaticModules_NSModule" && echo "NSModules are not ordered appropriately" && exit 1 || exit 0 -ifeq (,$(filter-out SunOS Linux,$(OS_ARCH))) +ifeq (Linux,$(OS_ARCH)) LOCAL_CHECKS += ; test "$$($(TOOLCHAIN_PREFIX)readelf -l $1 | awk '$1 == "LOAD" { t += 1 } END { print t }')" -le 1 && echo "Only one PT_LOAD segment" && exit 1 || exit 0 endif + +# It's safer to use elfdump on SunOS, because that's available on all +# supported versions of Solaris and illumos. + +ifeq (SunOS,$(OS_ARCH)) +LOCAL_CHECKS += ; test "elfdump -p $1 | awk '$5 == "PT_LOAD" { t += 1 } END { print t }')" -le 1 && echo "Only one PT_LOAD segment" && exit 1 || exit 0 +endif -- cgit v1.2.3