Q:[jbtzhm]为什么我用高版本的libc编译出的程序不能在低版本libc上运行,系统是怎么完成的?
A:[jbtzhm]gcc生成后的程序中添加了类型为SHT_GNU_verdef的节,包含glibc的版本信息,防止高版本的glibc连接的程序在低版本上运行。
./ls: /lib/libc.so.6: version `GLIBC_2.2.3' not found (required by ./ls)
./ls: /lib/libc.so.6: version `GLIBC_2.2' not found (required by ./ls)
Q:[jbtzhm]为什么我用-lstdc++链接程序,但是用ldd看时却使用的是libstdc++-XXXXXXXX的库?
A:[jbtzhm]ld链接程序时填写DT_NEEDED项(描述所需动态库名字)时,首先采用动态库中DT_SONAME的描述,如果没有此描述才采用文件名字填写DT_NEEDED,可以用objdump命令行查看libstdc++或其他动态库的DT_SONAME值.
Q:[jbtzhm]那么如何指定动态库的DT_SONAME值呢?
A:[jbtzhm]缺省情况下gcc -shared 编出的动态库是不只定DT_SONAME值的,如果指定可以采用
gcc -shared -o libtest.so libtest.c -fpic -Wl,-hlibnottest.so
这样libtest.so的DT_SONAME就被指定成了libnottest.so。
|