相关疑难解决方法(0)

如何提供 memcpy 的实现

我正在尝试编写一些带有memset-style 循环的裸机代码:

for (int i = 0; i < N; ++i) {
  arr[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)

它是用 GCC 编译的,GCC 足够聪明,可以将其转换为对memset(). 不幸的是,因为它是裸机,我没有memset()(通常在 libc 中)所以我收到链接错误。

 undefined reference to `memset'
Run Code Online (Sandbox Code Playgroud)

似乎进行这种转换的优化是-ftree-loop-distribute-patterns

执行可以通过调用库生成代码的模式的循环分布。默认情况下,此标志在 -O2 及更高级别以及由-fprofile-use和启用-fauto-profile

所以一个人的解决方案是降低优化级别。不是很满意。

我还发现这真的有用的网页,说明这-ffreestanding是不足以让GCC没有做到这一点,而且也根本没有选择,只能提供自己的实现memcpymemmovememsetmemcmp。我很乐意这样做,但是怎么做?

如果我只是编写memset编译器将检测其中的循环并将其转换为对 memset 的调用!事实上,在我使用的 CPU 供应商提供的代码中,我发现了这条评论:

/*
// This is commented out because the assembly code that the compiler generates …
Run Code Online (Sandbox Code Playgroud)

c gcc memset

37
推荐指数
1
解决办法
1128
查看次数

让GCC编译而不插入对memcpy的调用

我目前正在使用GCC 4.5.3,为PowerPC 440编译,并且正在编译一些不需要libc的代码.我没有直接调用memcpy(),但编译器似乎在构建期间插入一个.

有一些链接器选项,如-nostdlib,-nostartfiles,-nodefaultlibs但我无法使用它们,因为我没有进行链接阶段.我只是在编译.有这样的事情:

$ powerpc-440-eabi-gcc -O2 -g -c -o output.o input.c
Run Code Online (Sandbox Code Playgroud)

如果我用nm检查output.o,我会看到对memcpy的引用:

$ powerpc-440-eabi-nm output.o | grep memcpy
     U memcpy
$ 
Run Code Online (Sandbox Code Playgroud)

GCC手册页明确了如何使用链接器删除对memcpy和其他libc调用的调用,但我不希望编译器首先插入它们,因为我使用的是完全不同的链接器(不是GNU的ld) ,它不知道libc).

感谢您的任何帮助,您可以提供.

compiler-construction gcc libc memcpy

11
推荐指数
3
解决办法
8122
查看次数

标签 统计

gcc ×2

c ×1

compiler-construction ×1

libc ×1

memcpy ×1

memset ×1