在 glibc 编译中,dl-addr.c 添加 printf 时出现多重定义错误

问题描述 投票:0回答:2

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
compilation linker glibc
2个回答
2
投票

只需添加一个 printf 就可以给我 _itoa 的多个定义

不要这样做那样

Glibc相当复杂,修改时你需要知道自己在做什么。

发生的情况是

elf/ld.so
的链接失败(您没有说哪个目标失败,但我很确定是
ld.so
;将来请显示 整个 错误消息,而不仅仅是部分错误消息)它)。

ld.so
动态链接器,最终会将您的程序绑定到
printf
中的
libc.so.6
。出于显而易见的原因,
ld.so
本身无法动态链接到
printf
——它必须在
libc.so.6
mmap
编辑之前执行。因此,它链接了
libc.a
的最小部分,足以让它运行。
printf
不是最小运行时的一部分,因此您不能“仅添加对它的调用”。


0
投票

只需添加给定的答案,以防对其他人也有帮助(我无法发表评论)...

这不起作用的原因是因为 printf 本身是从 libc 加载的,libc 本身是一个共享库,并且在您尝试使用它时可能不可用。

但是您可以做的是使用 write 系统调用,它几乎在任何地方都可以工作:

write(1, "FOO\n", 4); // 1 is stdout
© www.soinside.com 2019 - 2024. All rights reserved.