Linux下编译一个静态链接的程序的注意点
2012-08-28 17:52
183 查看
1. ld的-static开关加上之后,就可以编译出一个静态链接的程序了。要注意该程序用到的所有的库,都要有相应的.a版本,编译的时候作为一个source file放到命令行中即可。光有库的.so没用,需要重新编译该库,让它生成.a文件。
2. 要注意ld的一个特性:当ld查找一个symbol的时候,ld只会往后查找,不会往前查找。比如程序以来两个库A和B,而A库又调用了B库中的函数,那 么编译的时候,在命令行上,A库文件要出现在B库文件的前面。当ld发现A库中某个函数找不到时,他就会往后查找,于是在B库中找到了这个函数,OK。如 果AB两个库互相依赖,那么一般命令行中要写成A B A或B A B这样的格式。这就是为什么也会经常看到命令行中有重复出现相同库的原因。比如A B A这种情况,当ld发现A中有个函数undefined时,往后查找,在B中找到了,OK;继续在B中发现一个函数undefined,也往后找,在A中
找到了该函数,然后也OK了。
3. 当不知道哪个函数在哪个.a中的时候,用objdump -t <filepath>|grep xxx来查找即可。注意看objdump的manual,不是grep出了东西就一定表示该库中有这个函数,还要看前面的flag。
还有一个非常重要的内容:在一个静态链接的程序中,不能出现dlopen函数调用,看下面:
The dlopen/() function is available only to a dynamically-linked process. A statically-linked process (one where libc is linked statically) can't call dlopen() because a statically-linked executable:
* doesn't export any of its symbols
* can't export the required structure for libraries to link against
* can't fill structures at startup needed to load subsequent shared objects.
看看此文是不是一个情况:http://www.cnblogs.com/super119/archive/2011/03/06/1972333.html
2. 要注意ld的一个特性:当ld查找一个symbol的时候,ld只会往后查找,不会往前查找。比如程序以来两个库A和B,而A库又调用了B库中的函数,那 么编译的时候,在命令行上,A库文件要出现在B库文件的前面。当ld发现A库中某个函数找不到时,他就会往后查找,于是在B库中找到了这个函数,OK。如 果AB两个库互相依赖,那么一般命令行中要写成A B A或B A B这样的格式。这就是为什么也会经常看到命令行中有重复出现相同库的原因。比如A B A这种情况,当ld发现A中有个函数undefined时,往后查找,在B中找到了,OK;继续在B中发现一个函数undefined,也往后找,在A中
找到了该函数,然后也OK了。
3. 当不知道哪个函数在哪个.a中的时候,用objdump -t <filepath>|grep xxx来查找即可。注意看objdump的manual,不是grep出了东西就一定表示该库中有这个函数,还要看前面的flag。
还有一个非常重要的内容:在一个静态链接的程序中,不能出现dlopen函数调用,看下面:
The dlopen/() function is available only to a dynamically-linked process. A statically-linked process (one where libc is linked statically) can't call dlopen() because a statically-linked executable:
* doesn't export any of its symbols
* can't export the required structure for libraries to link against
* can't fill structures at startup needed to load subsequent shared objects.
看看此文是不是一个情况:http://www.cnblogs.com/super119/archive/2011/03/06/1972333.html
相关文章推荐
- Linux下编译一个静态链接的程序的注意点
- linux下交叉编译libusb的方法及编译一个使用了libusb库的test程序的方法
- gcc程序编译时添加头文件和库文件时需注意的一个地方
- 在linux环境下尝试使用gcc编译一个程序,并验证-E\-S\-c选项
- 1.2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。并熟悉相关指令。
- Linux编译程序时的一些注意事项
- 一个C程序的编译过程(Linux环境下Gcc)
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- Linux编译程序时的一些注意事项
- Linux编译程序时的一些注意事项
- 利用winelib编译一个可在linux下运行的程序
- linux环境下编译源码和运行程序时,include文件和lib库文件的注意事项
- 一个C程序的编译过程(Linux环境下Gcc)
- 一个C程序的编译过程(Linux环境下GCC)
- linux下交叉编译libusb的方法及编译一个使用了libusb库的test程序的方法
- 【Linux】使用vim编写一个程序,gcc查看预处理、编译、汇编、链接过程
- linux编译程序注意及简要mkfile
- 在linux环境下尝试使用gcc编译一个程序,并验证-E\-S\-c选项
- 对android编译出来的build/host/linux-x86/bin下面的各种可执行程序进行一个了解
- <Linux>Linux对C程序的调试过程--gcc的编译过程