我有这样的典型要求:
内核/arch/arm/lib/csumpartial.S
中有一个文件,它有一个名为csumpartial()
的函数,它计算16位校验和(显然是汇编代码),并且使用EXPORT符号导出该函数。
我现在使用NEON优化实现了相同的function,使用名为csumpartial.c
的文件中的csumpartial.c
我有以下要求:
现在我想让我的版本函数'csumpartial'被调用的内核函数调用,而不是程序集版本。
– 为了达到这个目的,我应该用csumpartial.C文件replacecsumpartial.S文件吗? 但是,如何取代(所有的东西都需要照顾)?
这个csumpartial.c文件应该用一个特殊的编译器标记-mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3
进行NEON优化。
– 那么在哪里以及如何提及这个编译器标志?
简而言之,程序集版本应该被完全弃用,并且在内核被编译时,应该使用-mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3
标记来编译c版本。 当内核调用csumpartial
时候,应该调用函数的c版本
早期的帮助将不胜感激。
很less的投入:
让我知道更多的投入
注意:只有我会使用这个编辑好的内核,所以我理解这样一个replace的风险
如果您只想构建一次修改的内核, 请使用命令行中所需的编译标志将csumpartial.c编译为csumpartial.o 。 之后,编译你的整个内核。 GNU make不会将.s重新编译为具有更高时间戳的.o文件。
对于一个永久的解决方案:删除csumpartial.S,创建你的csumpartial.c,把下面这行添加到/ arch / arm / lib / Makefile :
CFLAGS_csumpartial.o += -mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3 # seems this line is not necessary $(obj)/csumpartial.o: $(obj)/csumpartial.c
我已经用黑客解决了这个问题,下面是我做的工作:
找出了两种替代方法来做到这一点:
将csumpartial.S
替换为arch/arm/lib/
下的csumpartial.S
,因为csumpartial.c
包含NEON指令,必须使用特殊编译器标志进行编译,将此行添加到Makefile:
CFLAGS_csumpartial.o += -mfpu=neon -mfloag-abi=softfp -mflax-vector-conversions -O3
(在某些情况下,由于编译器标志与霓虹灯标志的编译器标志相冲突,在编译期间这不应该起作用)
我们可以通过在Makefile中使用filter-out
函数来过滤出冲突的编译器标志,但是我们还会遇到另外一个问题,那就是过滤掉的标志也不会被其他文件所使用(因为我们只想排除编译器标志为csumpartial文件,所以这将是一个问题)
所以我想出了另一种方式(2)
要非常清楚,我做了以下步骤:
一个。 从arch/arm/lib
删除csumpartial.S
湾 从该文件夹下的Makefile中删除csumpartial.o
条目
C。 在arch/arm/lib
下创建一个新文件夹neon
d。 在这里添加csumpartial.c
文件,同时创建一个Makefile并将其添加到Makefile中
拱/臂/ LIB /氖/生成文件
KBUILD_CFLAGS += -mfpu=neon -mfloat-abi=softfp -flax-vector-conversions -O3
,
要在编译期间取消冲突的编译器标志,请使用以下几行:
KBUILD_FLAGS := $(filter-out -compiler-flags-to-negate, $(KBUILD_FLAGS))
lib-y := csumpartial.o
即 到最顶层的Makefile,即arch/arm/Makefile
添加这个libs-y+=arch/arm/lib/ arch/arm/lib/neon/
为我工作。