【问题标题】:how to linking with dynamic lib (.so) and static libc.a如何与动态库(.so)和静态 libc.a 链接
【发布时间】:2011-01-11 16:22:11
【问题描述】:

我正在尝试链接静态 libc.a 和动态 lib.so 失败。

我已经尝试了以下方法:

  1. 首先我测试所有动态:

    • gcc -shared libtest.c -o libtest.so
    • gcc -c main.c -o main.o
    • gcc main.o -o 测试 -L。 -ltest

    它正在工作(编译和执行)

  2. 其次,我测试我想要的(动态库和静态库):

    • gcc -shared libtest.c -o libtest.so
    • gcc -c main.c -o main.o
    • gcc main.o -o test libtest.so /usr/lib/libc.a

    它正在编译,但在执行时,它出现了段错误! strace 显示它正在尝试访问 libc.so !!!

  3. 最后我尝试编译一个不参考动态库的简单程序

    • gcc -static main.c --> 编译正常,运行正常
    • gcc main.c /usr/lib/libc.a --> 编译成功,运行:segmentation fault (a strace show that it's access to libc.so)

怎么做?

谢谢

【问题讨论】:

  • 什么操作系统?如果您为感兴趣的操作系统添加标签,将会有更多人看到该问题。
  • 使用的gcc是什么版本的?

标签: gcc linker shared-libraries static-libraries


【解决方案1】:

你的第二个测试(你想做的那个)在 i686-linux 上为我工作:

$ cat libtest.c 
#include <stdio.h>
void foo() { printf("%d\n", 42); }
$ cat main.c
#include <stdio.h>
extern void foo();
int main() { puts("The answer is:"); foo(); }
$ export LD_LIBRARY_PATH=$PWD                                                                                              
$ gcc -shared libtest.c -o libtest.so && gcc -c main.c -o main.o && gcc main.o -o test -L. -ltest && ./test        
The answer is:
42
$ gcc -shared libtest.c -o libtest.so && gcc -c main.c -o main.o && gcc main.o -o test libtest.so /usr/lib/libc.a && ./test
The answer is:
42

但是,您必须意识到您构建的共享库依赖于共享的 libc。所以,它自然会尝试在运行时打开它。

$ ldd ./libtest.so 
    linux-gate.so.1 =>  (0xb80c7000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7f4f000)
    /lib/ld-linux.so.2 (0xb80c8000)

实现您想要的一种方法是使用:-static-libgcc -Wl,-Bstatic -lc

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多