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