gpt4 book ai didi

linker - 如何强制 gcc 使用 newlibc 实现函数的自定义实现?

转载 作者:行者123 更新时间:2023-12-04 20:51:47 25 4
gpt4 key购买 nike

我正在为 ARM 微 Controller (SAM7) 开发嵌入式软件并使用 Yagarto 工具链。

我的代码目前链接 libc.a。但是我想使用内置函数的自定义实现 memcpy 我的代码已经有了。

我试过使用 -fno-builtin 和/或 -fno-builtin-memcpy GCC Manual 中所述但链接器仍然会提示以下警告:

contiki-crazy-horse.a(flashd_efc.o): In function `memcpy':
C:\Users\Melvin\GitRepo\projects\Amatis_Project\SAM7_Contiki\examples\er-rest-example/../../cpu/arm//at91sam7s-x/./flashd_efc.c:669: multiple definition of `memcpy'
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-memcpy.o):C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\string/../../../../../newlib-1.19.0/newlib/libc/string/memcpy.c:78: first defined here
collect2: ld returned 1 exit status
make: *** [rest-server-example-nosyms.crazy-horse] Error 1
../../cpu/arm/at91sam7s-x/Makefile.at91sam7s-x:181: recipe for target `rest-server-example-nosyms.crazy-horse' failed

使用某些 gcc 内置函数的自定义实现的正确方法是什么?

编辑 1:添加我正在使用的链接命令。在下面的代码中,Porject.a 是一个用所有项目的目标文件创建的存档文件。
CC       = arm-none-eabi-gcc
CFLAGSNO = -I. -I$(CONTIKI)/core -I$(CONTIKI_CPU) -I$(CONTIKI_CPU)/loader \
-I$(CONTIKI_CPU)/dbg-io \
-I$(CONTIKI)/platform/$(TARGET) \
${addprefix -I,$(APPDIRS)} \
-DWITH_UIP -DWITH_ASCII -DMCK=$(MCK) \
-Wall $(ARCH_FLAGS) -g -D SUBTARGET=$(SUBTARGET)

CFLAGS += $(CFLAGSNO) -O -DRUN_AS_SYSTEM -DROM_RUN -ffunction-sections

LDFLAGS += -L $(CONTIKI_CPU) --verbose -T $(LINKERSCRIPT) -nostartfiles -Wl,-Map,$(TARGET).map

$(CC) $(LDFLAGS) $(CFLAGS) -nostartfiles -o project.elf -lc Project.a

最佳答案

如果正在查找 memcpy()在 libc.a 中,它不与任何“内置”冲突,而是与 newlib 实现冲突。您可能还需要指定 -nostdlibs 选项并根据需要显式链接 libc.a 和 libm.a。

在搜索库文件 (.a) 文件之前链接目标 (.o) 文件,因此如果目标文件解析了符号,则不会在文件中搜索它。如果您将覆盖放在静态链接库中,那么您只需在链接器命令行上将其列在标准库(或任何其他使用标准库的库)之前。

[已添加] 以下最初是“评论”,但可能应该在答案中;它是为了回应问题中的“编辑 1”,以及下面关于链接顺序的评论:

更改 -nostartfiles -o project.elf -lc Project.a-nostdlib -o project.elf -start-group Project.a -lc -end-group .开关-nostdlib禁用启动文件(即 -nostartfiles )和标准库的默认链接。库分组导致迭代搜索组中的库,直到无法解析更多符号,从而允许解析像您这样的乱序和循环依赖项。分组开关的另一种形式是 -( Project.a -lc -) .

关于linker - 如何强制 gcc 使用 newlibc 实现函数的自定义实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9876515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com