在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
答案 0 :(得分:1)
只需添加一个printf就可以给出_itoa
的多个定义
不要 。
Glibc非常复杂,修改它时你需要知道自己在做什么。
正在发生的事情是elf/ld.so
的链接失败了(您没有说明目标失败了,但我很确定它是ld.so
;将来请显示整个错误消息,而不仅仅是其中的一部分。)
ld.so
是动态链接器,最终会将您的程序绑定到printf
中的libc.so.6
。由于显而易见的原因,ld.so
本身无法动态链接到printf
- 它必须在libc.so.6
甚至mmap
之前执行。因此,它链接在libc.a
的最小部分,足以让它运行。 printf
不是最小运行时的一部分,因此您不能“只是添加一个调用”。