获取链接静态库时使用的存档成员列表
Getting a list of archive members used while linking a static library
是否有现成的解决方案来获取在 link 存档(即静态库)时已使用(或将要使用)的存档成员列表?
假设我有一个提供 main
并依赖于 a
和 b
的目标文件。如果我 link 它针对静态库 lib.a
,在存档成员 a.o
中提供 a
、b
、c
、d
、b.o
、c.o
和 d.o
,那么我想得到一个包含 a.o
和 b.o
的列表,作为 [= 的副产品32=]访问图书馆或通过 运行 command_to_get_members main.o lib.a
是否有解决方案,或者我是否需要解析 nm
输出并手动解析存档成员的符号?
这是一个建议,一个脚本使用 nm
(带有 --defined-only
和 --undefined-only
)来整理哪些归档对象包含指定目标文件之一所需的符号:
#!/bin/bash
export LANG=C LC_ALL=C
objs=()
libs=()
for file in "$@" ; do
[ -r "$file" ] || continue
if [ "$file" = "${file%.*}.o" ]; then
objs+=("$file")
elif [ "$file" = "${file%.*}.a" ]; then
libs+=("$file")
else
printf '%s: Unknown file type. Skipping.\n' "$file" >&2
fi
done
nm --defined-only "${libs[@]}" 2>/dev/null | awk -v needsyms="$(nm -u "${objs[@]}" 2>/dev/null | sed -ne 's|^[\t ]*U[\t ]*||p')" \
'BEGIN {
split("", objlist)
n = split(needsyms, symlist)
for (i = 1; i <= n; i++) need[symlist[i]] = ""
}
/\.o:$/ {
name = [=10=]
sub(/:$/, "", name)
next
}
(NF >= 3) && ( in need) {
need[] = name
objlist[name] = objlist[name] " "
}
END {
# Print symbols found and their source objects:
# for (name in need) printf "%s: %s\n", need[name], name
# Print source objects from the archive, with symbols used from it:
for (name in objlist) printf "%s:%s\n", name, objlist[name]
}'
后缀为.a
的文件被认为是提供符号的归档对象,后缀为.o
的文件是具有未定义符号的目标文件。
是否有现成的解决方案来获取在 link 存档(即静态库)时已使用(或将要使用)的存档成员列表?
假设我有一个提供 main
并依赖于 a
和 b
的目标文件。如果我 link 它针对静态库 lib.a
,在存档成员 a.o
中提供 a
、b
、c
、d
、b.o
、c.o
和 d.o
,那么我想得到一个包含 a.o
和 b.o
的列表,作为 [= 的副产品32=]访问图书馆或通过 运行 command_to_get_members main.o lib.a
是否有解决方案,或者我是否需要解析 nm
输出并手动解析存档成员的符号?
这是一个建议,一个脚本使用 nm
(带有 --defined-only
和 --undefined-only
)来整理哪些归档对象包含指定目标文件之一所需的符号:
#!/bin/bash
export LANG=C LC_ALL=C
objs=()
libs=()
for file in "$@" ; do
[ -r "$file" ] || continue
if [ "$file" = "${file%.*}.o" ]; then
objs+=("$file")
elif [ "$file" = "${file%.*}.a" ]; then
libs+=("$file")
else
printf '%s: Unknown file type. Skipping.\n' "$file" >&2
fi
done
nm --defined-only "${libs[@]}" 2>/dev/null | awk -v needsyms="$(nm -u "${objs[@]}" 2>/dev/null | sed -ne 's|^[\t ]*U[\t ]*||p')" \
'BEGIN {
split("", objlist)
n = split(needsyms, symlist)
for (i = 1; i <= n; i++) need[symlist[i]] = ""
}
/\.o:$/ {
name = [=10=]
sub(/:$/, "", name)
next
}
(NF >= 3) && ( in need) {
need[] = name
objlist[name] = objlist[name] " "
}
END {
# Print symbols found and their source objects:
# for (name in need) printf "%s: %s\n", need[name], name
# Print source objects from the archive, with symbols used from it:
for (name in objlist) printf "%s:%s\n", name, objlist[name]
}'
后缀为.a
的文件被认为是提供符号的归档对象,后缀为.o
的文件是具有未定义符号的目标文件。