为什么不能使用 GCC 生成静态二进制文件

Why cannot generate static Binary with GCC

本文关键字:静态 二进制文件 GCC 不能 为什么      更新时间:2023-10-16

我正在尝试使用 GCC 在 ubuntu 上编译可能的代码,我想将代码作为独立代码运行,这是编译:

$ gcc -static-libstdc++  main.c -o Server1    `mysql_config --cflags --libs` -lssl -lcrypto  -lm -L /user-L/usr/lib/x86_64-linux-gnu 

然后为了验证输出 id 是否是静态的,我运行以下命令:

$ ldd Server1

导致以下输出:

    linux-vdso.so.1 =>  (0x00007ffce75e0000)
    libmysqlclient.so.20 => /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20 (0x00007fbd8662f000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbd86412000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbd86209000)
    libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fbd85fa0000)
    libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fbd85b45000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbd8577b000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fbd85561000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbd8535d000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fbd84fda000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbd84cd1000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fbd84abb000)
    /lib64/ld-linux-x86-64.so.2 (0x00005584efccf000)
$ 

那么为什么上面的库不包含在Server1二进制文件中呢?

要使用 gcc 编译独立程序,编译时需要使用 -static 标志。

例如:

gcc -static -o a.out main.c -lm

在您的情况下,您正在尝试将可执行文件链接到共享库。您将需要这些库的静态版本才能实现您的目标,否则ld将失败。