【问题标题】:Linking with newlib: undefined reference to memcpy与 newlib 链接:对 memcpy 的未定义引用
【发布时间】:2011-12-15 22:59:53
【问题描述】:

我正在尝试构建一个 arm 引导加载程序,它依赖 newlib 来提供一些系统调用(如 memcpy)。

当我跑步时:

arm-elf-ld -static -L /usr/arm-elf/lib/thumb/ -lc -nostdlib -nostartfile -Map=loader.map --cref -T loader.lds --gc-sections -Ttext 0x000000 -n -o loader.elf start.o _udivsi3.o _umodsi3.o main.o util.o gpio.o spi.o flashatmel.o flashjedec.o image.o time.o clock.o led.o register.o sdram.o

我得到以下信息:

 flashatmel.o flashjedec.o image.o time.o clock.o led.o register.o sdram.o            
 main.o: In function `TtyPutConfiguration':
/home/shawn/projects/netbridge-fx/loader/main.c:19: undefined reference to `memcpy'
main.o: In function `main':
/home/shawn/projects/netbridge-fx/loader/main.c:135: undefined reference to   `__gnu_thumb1_case_uqi'
/home/shawn/projects/netbridge-fx/loader/main.c:145: undefined reference to `__gnu_thumb1_case_uqi'
/home/shawn/projects/netbridge-fx/loader/main.c:155: undefined reference to `__gnu_thumb1_case_uqi'
/home/shawn/projects/netbridge-fx/loader/main.c:165: undefined reference to `__gnu_thumb1_case_uqi'
gpio.o: In function `GpioTest':
/home/shawn/projects/netbridge-fx/loader/gpio.c:139: undefined reference to `__gnu_thumb1_case_uqi'

目前,我正在攻击 memcpy,并希望其他人跟进。当我运行nm /usr/arm-elf/lib/thumb/libc.a(我相信它是libc 的newlib 版本)时,它显示:

lib_a-memcpy.o:
00000010 N $d
00000000 t $t
00000001 T memcpy

所以,这表明 memcpy 是在库中定义的。

我在上面的ld 命令上运行了strace,以确保它实际上正在查看该文件,并且确实如此。

我在这里缺少什么?为什么它抱怨未定义的 memcpy?

【问题讨论】:

    标签: arm ld newlib bare-metal


    【解决方案1】:

    这看起来很可疑:

    -lc -nostdlibs
    

    我认为 -nostdlibs 正在取消 -lc。尝试直接链接 libc.a 看看会发生什么。

    当您使用它时,我看到您正在链接一些内部实现(例如 _udivsi3.o)。尝试与 libgcc.a 链接,它应该包含您需要的所有内在函数的定义。

    【讨论】:

    • 直接链接文件有效,尽管我仍然不确定为什么 -lc-L 结合不起作用,即使没有 -nostdlib。有什么想法吗?
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    相关资源
    最近更新 更多