Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';通过GCC和LD链接有什么区别?_Gcc_Shared Libraries_Ld - Fatal编程技术网

什么';通过GCC和LD链接有什么区别?

什么';通过GCC和LD链接有什么区别?,gcc,shared-libraries,ld,Gcc,Shared Libraries,Ld,最近我创建了一个可加载的模块,发现 gcc -fPIC --shared -o foo.so.1 foo.c 及 可以达到同样的效果 我还发现foo.so.1比foo.so.2大约3KB gcc -### -fPIC --shared -o foo.so.1 foo.c 显示GCC在foo.so.1中添加了foo.c以外的内容(例如,crtrends.o和crtn.o): 由于foo.so.1和foo.so.2都可以通过dlopen加载,我想知道: 这两种链接方法有什么区别 crtn.o和c

最近我创建了一个可加载的模块,发现

gcc -fPIC --shared -o foo.so.1 foo.c

可以达到同样的效果

我还发现foo.so.1比foo.so.2大约3KB

gcc -### -fPIC --shared -o foo.so.1 foo.c
显示GCC在foo.so.1中添加了foo.c以外的内容(例如,crtrends.o和crtn.o):

由于foo.so.1和foo.so.2都可以通过dlopen加载,我想知道:

  • 这两种链接方法有什么区别
  • crtn.o和crtn.o对所创建库中的函数有什么不同吗

  • 原则上没有区别。当您“通过gcc链接”时,它实际上调用ld。如果您在“通过gcc链接”的链接阶段收到一条消息,您将立即看到它实际上来自ld。如果要将某些特定于ld的命令行选项传递给ld,gcc的命令行界面具有专门用于此目的的功能(
    -Xlinker
    -Wl
    选项)

    至于其他对象文件。。。它们可能包含编译器隐式添加的全局加载时库初始化/反初始化代码。(由标准库请求?)您可以在此处找到一些相关信息:

    如果“gcc链接”结果与直接ld调用不同,则gcc必须通过向ld传递附加参数(选项、LIB)来实现这一点。
    gcc -### -fPIC --shared -o foo.so.1 foo.c
    
    /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