我不是共享库方面最大的专家,所以我在这里可能错了!
如果我猜对了您要执行的操作,只需将您的共享库与 libc.so 链接即可。您不希望在库中嵌入额外的 sscanf 副本。
在我完全弄清楚你的意思之前,我回答了你的问题,以防你对答案感兴趣。
有没有办法告诉 ld 在构建共享库时只解析某些符号?
共享库的符号表中只有外部函数和变量,而不是静态函数和变量。
构建共享库时,链接器命令行上的对象中未找到的任何符号都将保持未解析。如果链接器对此抱怨,您可能需要将您的共享库链接到共享库。您可以拥有依赖于其他共享库的共享库,并且 ld.so 可以处理依赖链。
如果我有更多的代表,我会问这个作为评论:您是否有自定义版本的 sprintf/sscanf,或者您的共享库可以使用 -lc 中的实现吗?如果 -lc 没问题,那么我的回答可能会解决您的问题。如果没有,那么您需要使用仅具有您需要的功能的对象来构建您的共享库。即不要将其链接到/usr/lib/libc.a。
也许我被你弄糊涂了
libc.a(实际上不是“真正的”libc)行。/usr/lib/libc.a 真的是 glibc(在 linux 上)。它是 libc.so 中相同代码的静态链接副本。除非你在谈论你自己的 libc.a (这是我一开始的想法)......
将 libc.a 变成共享库?您可能可以,但不要,因为它可能没有编译为与位置无关的代码,因此 ld.so 在运行时需要进行大量重定位。
从 libc.a 中提取 sscanf 并在链接器行上指定它?
有可能。ar t /usr/lib/libc.a 列出内容。(ar 的 args 类似于 tar。tar 是用于磁带的 ar....这里是老式 Unix。)可能没那么容易,因为 sscanf 可能依赖于 .a 中其他 .o 文件中的符号。