【问题标题】:Function in .lib is defined but when i generate .so from same .lib the function is not present.lib 中的函数已定义,但是当我从同一个 .lib 生成 .so 时,该函数不存在
【发布时间】:2016-12-29 09:13:57
【问题描述】:

我有一个 lib1.lib,它具有函数 fun1(),它显示在我执行 nm 时已定义。 我从 my.lib 创建了 my.so。但是当我搜索 my.so 时,那个 fun1() 根本不存在。因为可能没有调用者,编译器可能会忽略它。 所以我创建了一些虚拟数组,比如

char* dummyArray={
 &fun1;
};

在定义 fun1() 的文件中。 但这也行不通。 请帮忙。

【问题讨论】:

  • 在您的示例中,fun1 是 [pointer to a] char,而不是指向函数的指针。此标识符不会与库中的标识符发生冲突。但是编译器会报错fun1未定义,所以请开启编译器警告。
  • 当我在 lib1.lib 上执行 nm 时,我可以看到符号已定义,但为什么当我生成 .so 时符号根本不存在??
  • 因为你不使用一个名为fun1函数(你只使用一个名为fun1char),链接器不会获取库中的函数。
  • 将尝试与 void* 相同
  • @PaulOgilvie 由于名称修改,该类型仅在 C++ 的情况下才相关(我怀疑这是 OP 的问题)。

标签: c linux gcc gdb


【解决方案1】:

只是包装

-Wl,--whole-archive -lyourlib -Wl,--no-whole-archive

链接.so时。背景见c-differ-between-linking-with-o-and-with-a-file-different-behavior-why

【讨论】:

    【解决方案2】:

    您需要强制编译器和链接器从库中获取函数。在您当前的尝试中,您在程序中引用了一个名为fun1 的字符。因为你的fun1 是一个字符,编译器没有理由在你的.o 文件中声明一个符号,它是一个名为fun1 的函数。因此,函数 fun1 将不会从库中获取,并且您的可执行文件中没有函数 fun1

    (请注意,在您的示例中,没有声明 char fun1,因此您的编译器应该抱怨。您是否打开了警告???)

    要强制编译器和链接器从库中加载函数fun1,可以这样写:

    char *fun1(void);    // prototype;
    
    char *(*p)(void)     // p is a pointer to a function with same signature as fun1...
         = fun1;         // and we initialize it with function 'fun1'
    

    注意:如果编译器确定你从不使用p,它仍然可能会删除函数指针变量和fun1对其的赋值,所以fun1仍然不会被加载。

    【讨论】:

    • 是否有任何编译器选项可以使编译器不忽略未调用的函数??
    • 我给你的解决方案,如果p被声明为全局或静态变量,将确保函数被加载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多