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:
+7
-1
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user