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

时间:2012-04-23 12:34:09

标签: c gtk ld

我使用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

如果我只是在上面的命令中用 clang 替换 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中:   (.text + 0x12):对__libc_csu_fini的未定义引用   /usr/lib/crt1.o:在函数_start中:   (.text + 0x19):对__libc_csu_init

的未定义引用

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

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

2 个答案:

答案 0 :(得分:2)

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

ld -o <output> /lib/crt0.o hello.o -lc

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

答案 1 :(得分:1)

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