summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorathenian200 <athenian200@outlook.com>2023-11-11 10:39:42 -0600
committerathenian200 <athenian200@outlook.com>2023-11-11 10:39:42 -0600
commit98f59fb96c80bb8664e0931eaead9c70898ed5a5 (patch)
treeb31105bfca36ce35f114e5b3355e034c42ddf78b
parentc789882a294d29b3e5450a972ad67c4839c75e23 (diff)
downloaduxp-98f59fb96c80bb8664e0931eaead9c70898ed5a5.tar.gz
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.
-rw-r--r--config/config.mk8
-rw-r--r--toolkit/library/dependentlibs.py22
-rw-r--r--toolkit/library/libxul.mk9
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