summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2023-11-13 11:46:33 +0000
committerMoonchild <moonchild@palemoon.org>2023-11-13 11:46:33 +0000
commita36a691826d9ea9ad4c564f2d27905f267a5e53d (patch)
treed4507995775ce9fff688d937693f911b85c0bf13
parent9816215ea7461dfbb1707809344b5d569ad615e3 (diff)
parent98f59fb96c80bb8664e0931eaead9c70898ed5a5 (diff)
downloaduxp-a36a691826d9ea9ad4c564f2d27905f267a5e53d.tar.gz
Merge pull request 'Use elfdump on SunOS instead of readelf.' (#2380) from athenian200/UXP:sunos-elfdump-fix into master
Reviewed-on: https://repo.palemoon.org/MoonchildProductions/UXP/pulls/2380
-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