在
glibc-2.13/nptl/sigaction.c
中,我只放了一个简单的printf("test\n");
,我的glibc编译失败了。只需添加 printf
就可以给我从 _itoa
得到 dl-addr.c
的多个定义,我不知道为什么。
任何人都可以告诉我为什么会发生这种情况以及可能的解决方案吗?错误:
test/glibc-build/libc_pic.a(_itoa.os): In function `_itoa':
test/glibc-2.13/stdio-common/_itoa.c:215: multiple definition of
`_itoa'
test/glibc-build/elf/dl-allobjs.os:test/glibc-2.13/elf/dl-minimal.c:300: first defined here
test/glibc-build/libc_pic.a(dl-addr.os): In function `_dl_addr_inside_object':
test/SOURCE/glibc-2.13/elf/dl-addr.c:156: multiple definition of
`_dl_addr_inside_object'
test/glibc-build/elf/dl-allobjs.os:glibc-2.13/elf/dl-open.c:658: first defined here
只需添加一个 printf 就可以给我 _itoa 的多个定义
不要这样做那样。
Glibc相当复杂,修改时你需要知道自己在做什么。
发生的情况是
elf/ld.so
的链接失败(您没有说哪个目标失败,但我很确定是 ld.so
;将来请显示 整个 错误消息,而不仅仅是部分错误消息)它)。
ld.so
是动态链接器,最终会将您的程序绑定到printf
中的libc.so.6
。出于显而易见的原因,ld.so
本身无法动态链接到printf
——它必须在libc.so.6
被mmap
编辑之前执行。因此,它链接了 libc.a
的最小部分,足以让它运行。 printf
不是最小运行时的一部分,因此您不能“仅添加对它的调用”。
只需添加给定的答案,以防对其他人也有帮助(我无法发表评论)...
这不起作用的原因是因为 printf 本身是从 libc 加载的,libc 本身是一个共享库,并且在您尝试使用它时可能不可用。
但是您可以做的是使用 write 系统调用,它几乎在任何地方都可以工作:
write(1, "FOO\n", 4); // 1 is stdout