第三方为我提供了一个静态库 (.a),用于在 Solaris 站上链接。
我尝试使用 sunpro 进行编译,但在链接步骤失败。
我想这个问题来自我使用的编译器(而不是 gcc?)或者只是它的版本(因为编译器提供的 std lib 可能会从库预期的版本发生变化,AFAIK 它可能会导致链接步骤中的错误)。
我怎么知道哪个编译器是用来生成这个库的?有一些工具可以做到这一点吗? sunpro/gcc 或其他什么选项?
作为提示:我前段时间读过,编译器在生成目标文件时使用不同的修饰约定(正确吗?)。仍然,“nm——去角”命令行很好地打印了这个静态库中调试符号的所有函数名称。它是如何工作的 ?如果我的假设没问题的话nm确实有办法解决静态库中使用的约定,不是吗?或者它只是意味着 lib 是由 GNU gcc 生成的,因为 nm 是 GNU binutils 的一部分?
从存档中提取目标文件,然后运行strings
对其中一些命令(首先对较小的命令进行命令,因为筛选的噪音会更少)。许多编译器在目标文件中插入 ASCII 签名。
例如下面这个无意义的源文件,foo.c
:
extern void blah();
当在我的 Fedora 10 机器上编译成 foo.o 时gcc -c -o foo.o foo.c
结果是 647 字节foo.o
对象文件。跑步strings
on foo.o
结果是
GCC: (GNU) 4.3.2 20081105 (Red Hat 4.3.2-7)
.symtab
.strtab
.shstrtab
.text
.data
.bss
.comment
.note.GNU-stack
foo.c
这清楚地表明编译器是 GCC。即使我用它来编译它-fno-ident
,.GNU-stack note ELF 部分仍然存在。
您可以使用以下命令提取目标文件ar
实用程序,或使用 Midnight Commander(集成了 ar),或者您可以简单地运行strings
存档(这可能会给您带来更多噪音并且相关性较低,但仍然会有所帮助。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)