diff options
Diffstat (limited to 'toolkit')
-rw-r--r-- | toolkit/library/dependentlibs.py | 22 | ||||
-rw-r--r-- | toolkit/library/libxul.mk | 9 |
2 files changed, 29 insertions, 2 deletions
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 |