我的问题与 ELF 中的符号有关。正如我们所知,ELF 的符号表包含定位和重定位程序的符号定义和引用所需的信息。
我的问题是我们能否区分 b/wa 库符号和用户定义的符号(如果两者都是全局的)?考虑没有源代码可用并且您只有 ELF 的场景。
我的问题与 ELF 中的符号有关。正如我们所知,ELF 的符号表包含定位和重定位程序的符号定义和引用所需的信息。
我的问题是我们能否区分 b/wa 库符号和用户定义的符号(如果两者都是全局的)?考虑没有源代码可用并且您只有 ELF 的场景。
静态库只是未链接的目标文件 ( .o
) 的存档(带有索引以加快链接器在其中搜索符号的速度)。当您链接到此类库时,链接器会获取每个未解析的符号并尝试在那里找到它。如果找到它,它会提取相应的对象并将其添加到要链接的集合中。所以不,您无法判断符号是否来自静态库。
如果您有另一个与可执行文件链接的足够接近的库实例,您可以查看它定义了哪些符号,然后假设所有这些符号以及所依赖的任何符号都来自该库。
当然可以告诉共享库中定义的符号,因为那仍然是不同的文件。
但还有一点:提供没有与 libc 静态链接的源的 Linux 二进制文件很可能是非法的。也就是说,如果那个 libc 是 GNU Libc,那绝对是非法的,因为它是根据 LGPL 的条款分发的,而 LGPL 要求提供(应要求)所有派生代码的源代码,但动态链接到它的代码除外。如果它使用不同的 libc,例如sourceware newlib或仿生 libc (Android)(我找不到其他的)。然而,我不确定这样的代码在基于 GNU libc 的系统中的效果如何。