Author: bdrewery
Date: Tue Apr 21 03:29:03 2015
New Revision: 281811
URL: https://svnweb.freebsd.org/changeset/base/281811

Log:
  - For executables search for matching (B) global uninitialized BSS symbols 
from
    linked libraries. Only do this for BSS symbols that have a size which avoids
    __bss_start. Without this some libraries would be considered unneeded even
    though they were providing a B symbol.
  - Add in the symbols from crt1.o to cover a handful of common unresolved 
symbols.
  - Consider (C) common data symbols as provided by libraries/crt1.
  - Move libkey() function to more appropriate place.
  
  Sponsored by: EMC / Isilon Storage Division

Modified:
  head/tools/build/check-links.sh

Modified: head/tools/build/check-links.sh
==============================================================================
--- head/tools/build/check-links.sh     Tue Apr 21 03:06:58 2015        
(r281810)
+++ head/tools/build/check-links.sh     Tue Apr 21 03:29:03 2015        
(r281811)
@@ -1,6 +1,23 @@
 #!/bin/sh
 # $FreeBSD$
 
+libkey() {
+       libkey="lib_symbols_$1"
+       patterns=[.+,-]
+       replacement=_
+       while :; do
+               case " ${libkey} " in
+                       *${patterns}*)
+                               
libkey="${libkey%%${patterns}*}${replacement}${libkey#*${patterns}}"
+                               ;;
+                       *)
+                               break
+                               ;;
+               esac
+       done
+       return 0
+}
+
 ret=0
 CHECK_UNRESOLVED=1
 while getopts "U" flag; do
@@ -11,33 +28,17 @@ done
 shift $((OPTIND-1))
 
 mime=$(file -L --mime-type $1)
+isbin=0
 case $mime in
-*application/x-executable);;
+*application/x-executable) isbin=1 ;;
 *application/x-sharedlib);;
 *) echo "Not an elf file" >&2 ; exit 1;;
 esac
 
 # Gather all symbols from the target
-unresolved_symbols=$(nm -D -u --format=posix "$1" | awk '$2 == "U" {print $1}' 
| tr '\n' ' ')
+unresolved_symbols=$(nm -D --format=posix "$1" | awk -v isbin=${isbin} '$2 == 
"U" || ($2 == "B" && $4 != "" && isbin == 1) {print $1}' | tr '\n' ' ')
 ldd_libs=$(ldd $(realpath $1) | awk '{print $1 ":" $3}')
 
-libkey() {
-       libkey="lib_symbols_$1"
-       patterns=[.+,-]
-       replacement=_
-       while :; do
-               case " ${libkey} " in
-                       *${patterns}*)
-                               
libkey="${libkey%%${patterns}*}${replacement}${libkey#*${patterns}}"
-                               ;;
-                       *)
-                               break
-                               ;;
-               esac
-       done
-       return 0
-}
-
 # Check for useful libs
 list_libs=
 resolved_symbols=
@@ -50,11 +51,11 @@ for lib in $(readelf -d $1 | awk '$2 ~ /
        done
        list_libs="$list_libs $lib"
        foundone=
-       lib_symbols="$(nm -D --defined-only --format=posix "${libpath}" | awk 
'$2 ~ /R|D|T|W|B|V/ {print $1}' | tr '\n' ' ')"
+       lib_symbols="$(nm -D --defined-only --format=posix "${libpath}" | awk 
'$2 ~ /C|R|D|T|W|B|V/ {print $1}' | tr '\n' ' ')"
        if [ ${CHECK_UNRESOLVED} -eq 1 ]; then
                # Save the global symbols for this lib
                libkey "${lib}"
-               setvar "${libkey}"  "${lib_symbols}"
+               setvar "${libkey}" "${lib_symbols}"
        fi
        for fct in ${lib_symbols}; do
                case " ${unresolved_symbols} " in
@@ -70,6 +71,14 @@ for lib in $(readelf -d $1 | awk '$2 ~ /
 done
 
 if [ ${CHECK_UNRESOLVED} -eq 1 ]; then
+       # Add in crt1 symbols
+       list_libs="${list_libs} crt1.o"
+       lib_symbols="$(nm --defined-only --format=posix "/usr/lib/crt1.o" | awk 
'$2 ~ /C|R|D|T|W|B|V/ {print $1}' | tr '\n' ' ')"
+       # Save the global symbols for this lib
+       libkey "crt1.o"
+       setvar "${libkey}" "${lib_symbols}"
+
+       # No search libs for all symbols and report missing ones.
        for sym in ${unresolved_symbols}; do
                found=0
                for lib in ${list_libs}; do
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to