防止ArmClang向标准C库添加调用

防止ArmClang向标准C库添加调用,clang,stm32,keil,Clang,Stm32,Keil,我正在评估STM32H753上的Keil Microvision IDE 我正在做不同优化级别下ARMCC5和AC6之间的编译器比较。AC6基于叮当声 我的代码没有使用memcpy,并且我在项目设置中未选中“使用MicroLIB”,但是我的代码中的基本字节/字节复制循环被替换为带有AC6的memcpy(仅在“高”优化级别)。ARMCC5不会发生这种情况 我尝试使用编译选项来避免这种情况,如前所述:-ffreestanding和-disable simplify libcalls,在编译器和链接器

我正在评估STM32H753上的Keil Microvision IDE

我正在做不同优化级别下ARMCC5和AC6之间的编译器比较。AC6基于叮当声

我的代码没有使用memcpy,并且我在项目设置中未选中“使用MicroLIB”,但是我的代码中的基本字节/字节复制循环被替换为带有AC6的memcpy(仅在“高”优化级别)。ARMCC5不会发生这种情况

我尝试使用编译选项来避免这种情况,如前所述:
-ffreestanding
-disable simplify libcalls
,在编译器和链接器级别上都是如此,但它没有改变(对于第二个选项,我收到一条错误消息,说该选项不受支持)

在ARMCLANG参考指南中,我发现了一些选项
-nostlib-nostlibinc
,它们阻止编译器使用标准库的任何函数

但是我仍然需要
math.h
函数

您知道如何防止clang使用标准C库中未在代码中明确调用的函数吗

编辑:下面是一个快速且肮脏的可复制示例:
请不要讨论这个例子的质量,我知道这是愚蠢的!!,我知道memset等等。。。只是为了理解这个问题

gcc知道很多关于memcpy、memset和类似的函数,甚至它们被称为“内置函数”。如果不希望在默认情况下使用这些函数,只需使用命令行选项
-fno builtin


memcpy的具体问题是什么?在某些情况下,需要使用
memcpy
的字节循环,避免
memcpy
意味着内联/展开所述循环,可能会增加程序大小。memcpy没有技术问题。但我正在使用的软件是通过一项计划(安全软件)认证的,该计划禁止使用任何外部软件,包括标准C库。例外情况是可能的,但必须是合理的,并且不被通知。此外,在一些受约束的嵌入式环境中,标准lib C提供的
memcpy
效率不高(例如在
arm none-eabi-gcc
上,它使用LDRB指令,可以执行LDM并节省大量时间)因此,编译器生成的内联字节复制循环不算作外部软件,但来自C库的同一个循环算作外部软件?您能否提供一个生成
memcpy
调用的示例?您可以用不需要
memcpy
的方式重写它。关于库函数的缓慢实现,请参见,这同样适用于
memcpy
。性能实际上不是主要问题。不使用外部软件的想法是,每一段代码都必须指定、记录、单元测试等。当然,最后我可以使用memcpy的汇编代码并完成所有这些…哦,我的。。。你说得对。那么我建议你把这个答案添加到线程中