1
0
mirror of https://github.com/roytam1/UXP.git synced 2026-05-26 13:58:49 +00:00

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.
This commit is contained in:
athenian200
2023-11-11 10:39:42 -06:00
committed by roytam1
parent 6c37943e1c
commit 926ee14909
3 changed files with 36 additions and 3 deletions
+7 -1
View File
@@ -558,8 +558,14 @@ CHECK_STDCXX = $(call CHECK_SYMBOLS,$(1),GLIBCXX,libstdc++,v[1] > 3 || (v[1] ==
CHECK_GLIBC = $(call CHECK_SYMBOLS,$(1),GLIBC,libc,v[1] > 2 || (v[1] == 2 && v[2] > 12))
endif
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
ifeq ($(MOZ_WIDGET_TOOLKIT),android)
+21 -1
View File
@@ -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
+8 -1
View File
@@ -47,6 +47,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