如何混合二进制文件的动态和静态链接已经有了一些答案。 就像我到目前为止阅读的答案一样,我编译如下:
gcc main.cpp -static-libstdc++ -static-libgcc -Wl,-Bstatic -lm -lstdc++ -lpthread -lrt -lc -Wl,-Bdynamic -lmyshared_lib -L. libx.a liby.a
但后来我收到了一个错误:
/usr/lib/gcc/i686-redhat-linux/4.7.2/../../../libpthread.a(libpthread.o): In function `sem_open':
(.text+0x6407): warning: the use of `mktemp' is dangerous, better use `mkstemp'
/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/gcc/i686-redhat-linux/4.7.2/../../../libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie
collect2: error: ld returned 1 exit status
第三方lib本身依赖于libc.so.6,所以我猜这现在与我的静态链接libc冲突了。 如果我使用-fPIE和-pie参数进行编译,如下所示 - 应用程序会立即进行段错误:
gcc main.cpp -fPIE -static-libstdc++ -static-libgcc -Wl,-Bstatic -lm -lstdc++ -lpthread -lrt -lc -Wl,-Bdynamic -lmyshared_lib -L. libx.a liby.a -Wl,-pie
它甚至可以编译几乎完全静态,只是另外链接一个共享对象吗?
我尝试这样做是因为我希望使用32位第三方共享对象在x64系统上运行一个特定的32位二进制文件...