ld抱怨:在函数“_start”中,未定义引用“__libc_csu_fini”和“__libc_csu_init”

我用clang而不是gcc编译了一个GTK +程序。 到目前为止这么好,除了我没有正确的ld链接。

原来的makefile叫做gcc来做链接,如下所示:

gcc -g -O2 -export-dynamic -o my_application somefile.o another.o -pthread -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lart_lgpl_2 -lgconf-2 -lglade-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lxml2 -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0

如果我只是在上面的命令中用gng替换gcc ,我会从后者那里得到这个警告:

clang:warning:编译过程中未使用的参数:’ – x xport-dynamic’

问题是:clang不会将“-export-dynamic”识别为链接器选项,因此它不会将其传递给ld 。 这导致对外部函数的引用被废弃:当执行最终二进制时,菜单选项和按钮都不起作用。

如果我使用gcc做最后的连接步骤,二进制文件就可以完美地工作(尽管它实际上是用clang和gcc编译的,只能进行链接)。 因为我试图用我的机器中的clang完全替换gcc,这是不可接受的。

所以我尝试了这个:

ld /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o -g -O2 -export-dynamic my_application somefile.o another.o -o -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lart_lgpl_2 -lgconf-2 -lglade-2.0 -lgtk-x11-2.0 -lgdk-x11 -2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lloiro -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lxml2 -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0

通过添加前3个对象,我避免了“找不到_start”消息。 但后来我得到了上述两个投诉:

/usr/lib/crt1.o:在函数_start :(。 __libc_csu_fini + 0x12)中:对__libc_csu_fini /usr/lib/crt1.o的未定义引用:在函数_start :(。 __libc_csu_fini + 0x19):对__libc_csu_init未定义引用

我尝试在列表中添加crtbegin.o和crtend.o,甚至在crt1.o之前,无济于事。 链接器的正确调用是什么?

(Post Edit):如果没有其他工作,有没有办法捕捉gcc用于链接时gcc传递给ld的确切参数?

您可以使用-Wl,-export-dynamic-export-dynamic传递给ld,而无需知道clang。

gcc自动将语言支持库和对象添加到您提供的链接列表中。 如果要直接调用ld则必须自己添加它们。 以man ld为例,它可能是

 ld -o  /lib/crt0.o hello.o -lc 

尝试添加-lc ,您需要的符号应该在其中(至少在我的系统上,它是)。