获取链接静态库时使用的存档成员列表

Getting a list of archive members used while linking a static library

是否有现成的解决方案来获取在 link 存档(即静态库)时已使用(或将要使用)的存档成员列表?

假设我有一个提供 main 并依赖于 ab 的目标文件。如果我 link 它针对静态库 lib.a,在存档成员 a.o 中提供 abcdb.oc.od.o,那么我想得到一个包含 a.ob.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的文件是具有未定义符号的目标文件。