【问题标题】:multiple definition error from dl-addr.c with addition of printf, in glibc compilation来自 dl-addr.c 的多重定义错误,在 glibc 编译中添加了 printf
【发布时间】:2012-01-15 16:20:03
【问题描述】:

glibc-2.13/nptl/sigaction.c 中,我只输入了一个简单的printf("test\n");,我的glibc 编译失败。只需添加一个printf,我就可以从dl-addr.c_itoa 进行多个定义,我不知道为什么。

任何人都可以告诉我为什么会发生这种情况以及可能的解决方案。错误:

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


    【解决方案1】:

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

    不要那样做

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

    发生的事情是elf/ld.so 的链接失败(你没有说哪个目标失败了,但我很确定它是ld.so;以后请显示整个错误消息,而不仅仅是其中的一部分)。

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

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2015-07-20
      • 2012-09-24
      • 1970-01-01
      • 2016-07-13
      • 2015-08-01
      • 2013-03-25
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多