diff options
| -rwxr-xr-x | sbolint | 4 | ||||
| -rw-r--r-- | sbopkglint.d/75-static_libs.t.sh | 52 | 
2 files changed, 53 insertions, 3 deletions
| @@ -1671,6 +1671,10 @@ sub check_junkfiles {  				log_warning("$file is a build log");  				next FILE;  			}; +			/\.rej$/ && do { +				log_warning("$file is a patch reject"); +				next FILE; +			};  			/\.desktop$/ && do {  				system("desktop-file-validate $file");  				if($? != 0) { diff --git a/sbopkglint.d/75-static_libs.t.sh b/sbopkglint.d/75-static_libs.t.sh index ae6a4f5..24e7cd2 100644 --- a/sbopkglint.d/75-static_libs.t.sh +++ b/sbopkglint.d/75-static_libs.t.sh @@ -12,28 +12,74 @@  # triggered, suggesting removal of the static lib. this is not an error.  # TODO: this will give us file's idea of what's inside a .a archive: -# $ bsdtar -xOf /usr/lib64/libz.a '*.*' | file -b - +# $ ar p blah.a | file -Sb -  # ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped  # For 32-bit:  # ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped +# Note that file needs the -S, seccomp causes file to occasionally fail +# with 'Bad system call' when working on stdin. No idea why, -S fixes it.  # 'not stripped' is *correct*, don't complain about it! actually maybe -# it should complain if it *is* stripped, since +# it should complain if it *is* stripped...?  # Armed with this knowledge, we can do the same kind of arch checks for  # static libs as we do for shared (32-bit belongs in lib, 64 in lib64,  # arch of the static lib should match package's ARCH, etc). +# Have a look at /usr/lib64/libm.a: it's a linker script. File says it's +# ASCII text. +# r0ni says aarch64 does this: +# ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), not stripped + +check_static_arch() { +	local lib="$1" +	local libarch="$2" +	local libdir="$( dirname "$lib" )" +	local dir="$( basename "$libdir" )" # lib or lib64 + +	case "$libarch" in +		x86)    wantdir="lib" ;; +		x86_64) wantdir="lib64" ;; +	esac +} + +check_static_lib() { +	case "$( ar p "$1" | file -Sb - )" in +		empty)    # empty static libs are allowed, but get a 'note'. +			note "$1 is an empty static library, remove it if not needed by a dependee." ;; +		LLVM*) ;; # e.g. "LLVM IR bitcode", assume OK. +		ELF*x86-64*) +			check_static_arch "$1" x86_64 +			;; +		ELF*80386*) +			check_static_arch "$1" x86 +			;; +		# TODO: aarch64 +		*) ;; # dunno, assume OK +	esac +}  for libdir in lib lib64 usr/lib usr/lib64; do  	if [ -d $libdir ]; then  		find_warnfiles "bad static library ownership (should be root:root):" \  			-L $libdir -mindepth 1 -maxdepth 1 -name '*.a' \! \( -user root -a -group root \) +  		find_warnfiles "bad static library permissions (should be 0644 or 0444):" \  			-L $libdir -mindepth 1 -maxdepth 1 -name '*.a' \! \( -perm 444 -o -perm 644 \) +  		find $libdir -mindepth 1 -maxdepth 1 -name '*.a' | while read static; do  			ftype="$( file -L -b --mime-type "$static" )" +  			case "$ftype" in -				"application/x-archive") ;; # OK +				"application/x-archive") +					check_static_lib "$static" ;; +				"application/x-executable") +					warn "$static is an executable, not a static library." ;; +				"application/x-object") +					warn "$static is a shared library (.so), not a static library." ;; +				"text/plain") +				# TODO: check that this is a valid linker script (when I learn how). for now, ignore. +				;;  				*) warn "$static is not a valid static library. MIME type is '$ftype'." ;;  			esac +  			shared=$libdir/"$( basename "$static" .a)".so  			if [ -e "$shared" ]; then  				shname="$( basename "$shared" )" | 
