forked from pool/rpmlint
100 lines
4.3 KiB
Diff
100 lines
4.3 KiB
Diff
From: Jan Blunck <jblunck@suse.de>
|
|
Subject: Add checks for static libraries missing symtab and debuginfo
|
|
|
|
Static libraries without a symbol table are not linkable. Binaries linking
|
|
against static libraries without debuginfo are not debuggable.
|
|
---
|
|
BinariesCheck.py | 31 +++++++++++++++++++++++++++++--
|
|
1 file changed, 29 insertions(+), 2 deletions(-)
|
|
|
|
Index: BinariesCheck.py
|
|
===================================================================
|
|
--- BinariesCheck.py.orig
|
|
+++ BinariesCheck.py
|
|
@@ -32,6 +32,8 @@ class BinaryInfo:
|
|
undef_regex=re.compile('^undefined symbol:\s+(\S+)')
|
|
unused_regex=re.compile('^\s+(\S+)')
|
|
debug_file_regex=re.compile('\.debug$')
|
|
+ debuginfo_regex=re.compile('^\s+\[\s*\d+\]\s+\.debug_.*\s+')
|
|
+ symtab_regex=re.compile('^\s+\[\s*\d+\]\s+\.symtab\s+')
|
|
|
|
def __init__(self, pkg, path, file, is_ar):
|
|
self.had_error=0
|
|
@@ -42,6 +44,8 @@ class BinaryInfo:
|
|
self.comment=0
|
|
self.soname=0
|
|
self.non_pic=1
|
|
+ self.debuginfo=0
|
|
+ self.symtab=0
|
|
|
|
is_debug=BinaryInfo.debug_file_regex.search(path)
|
|
|
|
@@ -65,6 +69,10 @@ class BinaryInfo:
|
|
r=BinaryInfo.soname_regex.search(l)
|
|
if r:
|
|
self.soname=r.group(1)
|
|
+ if BinaryInfo.debuginfo_regex.search(l):
|
|
+ self.debuginfo=1
|
|
+ if BinaryInfo.symtab_regex.search(l):
|
|
+ self.symtab=1
|
|
if self.non_pic:
|
|
self.non_pic=BinaryInfo.non_pic_regex.search(res[1])
|
|
else:
|
|
@@ -114,6 +122,7 @@ shared_object_regex=re.compile('shared o
|
|
executable_regex=re.compile('executable')
|
|
libc_regex=re.compile('libc\.')
|
|
ldso_soname_regex=re.compile('^ld(-linux(-(ia|x86_)64))?\.so')
|
|
+ar_regex=re.compile('\.a$')
|
|
so_regex=re.compile('/lib(64)?/[^/]+\.so(\.[0-9]+)*$')
|
|
validso_regex=re.compile('(\.so\.\d+(\.\d+)*|\d\.so)$')
|
|
sparc_regex=re.compile('SPARC32PLUS|SPARC V9|UltraSPARC')
|
|
@@ -171,7 +180,7 @@ class BinariesCheck(AbstractCheck.Abstra
|
|
|
|
for i in info:
|
|
is_elf = string.find(i[1], 'ELF') != -1
|
|
- is_ar = string.find(i[1], 'current ar archive') != -1
|
|
+ is_ar = ar_regex.search(i[0])
|
|
is_ocaml_native = string.find(i[1], 'Objective caml native') != -1
|
|
is_shell = string.find(i[1], "shell script") != -1
|
|
is_binary = is_elf or is_ar or is_ocaml_native
|
|
@@ -196,13 +205,23 @@ class BinariesCheck(AbstractCheck.Abstra
|
|
|
|
# stripped ?
|
|
if not unstrippable.search(i[0]) and not is_ocaml_native:
|
|
- if not_stripped.search(i[1]) and \
|
|
+ if not is_ar and not_stripped.search(i[1]) and \
|
|
(os.environ.get('BUILD_IS_RUNNING', None) == None or \
|
|
os.environ.get('BUILD_DEBUG_FLAGS','').find('-g') != -1):
|
|
printWarning(pkg, 'unstripped-binary-or-object', i[0])
|
|
|
|
# inspect binary file
|
|
bin_info=BinaryInfo(pkg, pkg.dirName()+i[0], i[0], is_ar)
|
|
+ # stripped static library
|
|
+ if is_ar:
|
|
+ if bin_info.had_error:
|
|
+ pass
|
|
+ elif not bin_info.symtab:
|
|
+ printError(pkg, 'static-library-without-symtab', i[0])
|
|
+ elif not bin_info.debuginfo and \
|
|
+ (os.environ.get('BUILD_IS_RUNNING', None) == None or \
|
|
+ os.environ.get('BUILD_DEBUG_FLAGS','').find('-g') != -1):
|
|
+ printWarning(pkg, 'static-library-without-debuginfo', i[0])
|
|
|
|
# so name in library
|
|
if so_regex.search(i[0]):
|
|
@@ -441,6 +460,14 @@ with the intended shared libraries only.
|
|
|
|
'ldd-failed',
|
|
'''Executing ldd on this file failed, all checks could not be run.''',
|
|
+
|
|
+'static-library-without-symtab',
|
|
+'''The static library doesn't contain any symbols and therefore can't be linked
|
|
+against. This may indicated that it was strip.''',
|
|
+
|
|
+'static-library-without-debuginfo',
|
|
+'''The static library doesn't contain any debuginfo. Binaries linking against
|
|
+this static library can't be properly debugged.''',
|
|
)
|
|
|
|
# BinariesCheck.py ends here
|