【发布时间】:2014-11-26 23:22:57
【问题描述】:
最近我在创建一个可加载的模块,发现两者都
gcc -fPIC --shared -o foo.so.1 foo.c
和
gcc -fPIC --shared -c foo.c
ld --shared -o foo.so.2 foo.o
可以达到同样的效果。
我还发现 foo.so.1 比 foo.so.2 大了大约 3KB,并且
gcc -### -fPIC --shared -o foo.so.1 foo.c
发现 GCC 在 foo.so.1 中添加了 foo.c 以外的内容(例如 crtendS.o 和 crtn.o):
/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 "--sysroot=/" --build-id --no-add-needed --eh-frame-hdr -m elf_x86_64 "--hash-style=both" -shared -o foo.so.1 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. /tmp/cc3JBdCJ.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o
既然 foo.so.1 和 foo.so.2 都可以通过 dlopen 加载,我想知道:
- 这两种链接方法有什么区别?
- crtendS.o 和 crtn.o 对创建的库中的函数有什么影响吗?
【问题讨论】:
标签: gcc shared-libraries ld