zoukankan      html  css  js  c++  java
  • Linux下编译一个静态链接的程序的注意点

    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

  • 相关阅读:
    【Emit基础】IL定义方法的语法详解
    Audit login 与 Audit logout
    锁定与并发
    【Emit基础】调用Tostring()方法的IL表示
    《DataRabbit 完全手册V1.0》 发布
    Remoting方法重载遇到的一个问题
    DataRabbit 3.1发布,完全支持SqlServer2005/2008
    A*算法的C#实现
    Spring.net 的一个bug ?
    【Emit基础】System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
  • 原文地址:https://www.cnblogs.com/super119/p/1996124.html
Copyright © 2011-2022 走看看