Browse Source
Shell scripts are not easily invoked from the build process on MSYS, so convert undefsym.sh to a python script. Signed-off-by: Yonggang Luo <luoyonggang@gmail.com> Message-Id: <20200902170054.810-3-luoyonggang@gmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>pull/96/head
committed by
Paolo Bonzini
3 changed files with 50 additions and 21 deletions
@ -0,0 +1,49 @@ |
|||
#!/usr/bin/env python3 |
|||
|
|||
# Before a shared module's DSO is produced, a static library is built for it |
|||
# and passed to this script. The script generates -Wl,-u options to force |
|||
# the inclusion of symbol from libqemuutil.a if the shared modules need them, |
|||
# This is necessary because the modules may use functions not needed by the |
|||
# executable itself, which would cause the function to not be linked in. |
|||
# Then the DSO loading would fail because of the missing symbol. |
|||
|
|||
|
|||
import sys |
|||
import subprocess |
|||
|
|||
def filter_lines_set(stdout, from_staticlib): |
|||
linesSet = set() |
|||
for line in stdout.splitlines(): |
|||
tokens = line.split(b' ') |
|||
if len(tokens) >= 1: |
|||
if len(tokens) > 1: |
|||
if from_staticlib and tokens[1] == b'U': |
|||
continue |
|||
if not from_staticlib and tokens[1] != b'U': |
|||
continue |
|||
new_line = b'-Wl,-u,' + tokens[0] |
|||
if not new_line in linesSet: |
|||
linesSet.add(new_line) |
|||
return linesSet |
|||
|
|||
def main(args): |
|||
if len(args) <= 3: |
|||
sys.exit(0) |
|||
|
|||
nm = args[1] |
|||
staticlib = args[2] |
|||
pc = subprocess.run([nm, "-P", "-g", staticlib], stdout=subprocess.PIPE) |
|||
if pc.returncode != 0: |
|||
sys.exit(1) |
|||
staticlib_syms = filter_lines_set(pc.stdout, True) |
|||
|
|||
shared_modules = args[3:] |
|||
pc = subprocess.run([nm, "-P", "-g"] + shared_modules, stdout=subprocess.PIPE) |
|||
if pc.returncode != 0: |
|||
sys.exit(1) |
|||
modules_undef_syms = filter_lines_set(pc.stdout, False) |
|||
lines = sorted(staticlib_syms.intersection(modules_undef_syms)) |
|||
sys.stdout.buffer.write(b'\n'.join(lines)) |
|||
|
|||
if __name__ == "__main__": |
|||
main(sys.argv) |
|||
@ -1,20 +0,0 @@ |
|||
#! /usr/bin/env bash |
|||
|
|||
# Before a shared module's DSO is produced, a static library is built for it |
|||
# and passed to this script. The script generates -Wl,-u options to force |
|||
# the inclusion of symbol from libqemuutil.a if the shared modules need them, |
|||
# This is necessary because the modules may use functions not needed by the |
|||
# executable itself, which would cause the function to not be linked in. |
|||
# Then the DSO loading would fail because of the missing symbol. |
|||
|
|||
if test $# -le 2; then |
|||
exit 0 |
|||
fi |
|||
|
|||
NM=$1 |
|||
staticlib=$2 |
|||
shift 2 |
|||
# Find symbols defined in static libraries and undefined in shared modules |
|||
comm -12 \ |
|||
<( $NM -P -g $staticlib | awk '$2!="U"{print "-Wl,-u," $1}' | sort -u) \ |
|||
<( $NM -P -g "$@" | awk '$2=="U"{print "-Wl,-u," $1}' | sort -u) |
|||
Loading…
Reference in new issue