在glibc编译中添加了printf的dl-addr.c中的多重定义错误

时间:2011-12-08 07:11:11

标签: compilation linker glibc

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

1 个答案:

答案 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不是最小运行时的一部分,因此您不能“只是添加一个调用”。