Linux kernel LDFLAGS的含义是什么

Linux kernel LDFLAGS的含义是什么,linux-kernel,cross-compiling,ldflags,Linux Kernel,Cross Compiling,Ldflags,我正在尝试为ARM linux编译AODV。我使用SabreLite作为内核版本为3.0.35_4.1.0的板。值得一提的是,我正在使用openembedded为我的主板创建Linux发行版。 AODV源代码()有一个自述文件,它给出了如何在ARM上安装它的一些指示,如这里所述。 () 我能够升级makefile以便与Post2.6内核版本一起使用(如上所述,我有3.0.35_4.1.0内核版本)。 所以,基本上,我要做的是创建一个模块(比如file.ko),然后将其加载到ARM中(使用insm

我正在尝试为ARM linux编译AODV。我使用SabreLite作为内核版本为3.0.35_4.1.0的板。值得一提的是,我正在使用openembedded为我的主板创建Linux发行版。 AODV源代码()有一个自述文件,它给出了如何在ARM上安装它的一些指示,如这里所述。 ()

我能够升级makefile以便与Post2.6内核版本一起使用(如上所述,我有3.0.35_4.1.0内核版本)。 所以,基本上,我要做的是创建一个模块(比如file.ko),然后将其加载到ARM中(使用insmod file.ko命令)

为此,我使用了一个交叉编译器,其中一些值如下所述:

  • echo$CC: arm oe linux gnueabi gcc-march=armv7-a-mthumb interwork-mfloat abi=hard-mfpu=neon-mtune=cortex-a9-sysroot=/usr/local/oecore-x86_64/sysroot/cortexa9hf vfp neon oe linux gnueabi

  • echo$ARCH=arm

  • echo$CFLAGS:O2-pipe-g-feliminate未使用的调试类型

  • echo$LD: arm oe linux gnueabi ld--sysroot=/usr/local/oecore-x86_64/sysroot/cortexa9hf vfp neon oe linux gnueabi

  • echo$LDFLAGS: -Wl,-O1-Wl,--hash style=gnu-Wl,--as-needed-Wl,--as-needed

当我启动“make命令”时,出现以下错误:

LD[M]/home/scof/script\u仿真/AODV/AODV-uu/lnx/kaodv.o

arm oe linux gnueabi ld:无法识别的选项'-Wl,-O1'

arm oe linux gnueabi ld:使用--help选项获取使用信息

它表明链接器有问题。这个链接器来自交叉编译工具,我通常不应该碰它

无论如何,为了修复上述错误,我尝试像这样撤销LDFLAGS: 导出LDFLAGS='', 在这之后,make命令开始工作,我得到模块kaodv.ko。但当我把它插入手臂检查时,它不起作用。它实际上冻结了我的终端

所以我的问题是,编译时是否必须指定LDFLAGS?撤销LDFLAGS是否会对生成的内核模块产生影响。 事实上,我试图了解问题可能出在哪里,我唯一想到的是,可能我不应该手动更改LDFLAGS。但是如果我不更改de LDFLAGS,我会得到无法识别的选项错误

与此相关的第二个问题是,LDFLAGS的可能值是什么 ARM编译


谢谢

-O1
是一个通知链接器进行优化的选项。我相信这是新的,你的链接器可能有点过时了。尝试删除
-Wl,-O1
,它应该仍然有效。

-O1
是一个通知链接器进行优化的选项。我相信这是新的,你的链接器可能有点过时了。尝试删除
-Wl,-O1
,它仍然可以工作

echo$LDFLAGS:-Wl,-O1-Wl,--hash style=gnu-Wl,--as-needed-Wl,--as-needed

在基于GCC的工具链中,有两种调用链接器的常用方法。一种是直接执行,另一种是使用GCC作为前端来调用链接器,而不是直接调用它。执行此操作时,链接器的选项前缀为
-Wl,
,以便GCC知道如何传递它们,而不是自己解释它们

在您的情况下,来自LD本身的错误消息

arm oe linux gnueabi ld:无法识别的选项'-Wl,-O1'

指示生成系统正在将
LDFLAGS
直接传递到链接器,而不是通过GCC

因此,您应该删除
-Wl,
前缀,而您的LDFLAGS将改为

-O1——hash style=gnu——根据需要——根据需要

(重复上一个论点可能毫无意义,但却是善意的)

echo$LDFLAGS:-Wl,-O1-Wl,--hash style=gnu-Wl,--as-needed-Wl,--as-needed

在基于GCC的工具链中,有两种调用链接器的常用方法。一种是直接执行,另一种是使用GCC作为前端来调用链接器,而不是直接调用它。执行此操作时,链接器的选项前缀为
-Wl,
,以便GCC知道如何传递它们,而不是自己解释它们

在您的情况下,来自LD本身的错误消息

arm oe linux gnueabi ld:无法识别的选项'-Wl,-O1'

指示生成系统正在将
LDFLAGS
直接传递到链接器,而不是通过GCC

因此,您应该删除
-Wl,
前缀,而您的LDFLAGS将改为

-O1——hash style=gnu——根据需要——根据需要


(上一个参数的重复可能是毫无意义的,但却是良性的)

仅仅删除一个(
-Wl,-O1
)标志是否可以让事情正常工作?@EtanReisner我已经尝试删除(-Wl,-01),但我得到了以下错误:arm oe linux gnueabi ld:unrecogned option'-Wl,--hash style=gnu'这就是为什么我将它们全部撤回,以获得显然不工作的模块。您可以使用V=1运行make。有关更多信息,请参阅和参考。有对
LDFLAGS
等的引用。此外,您不应触摸这些选项。内核通常假定某些选项用于生成代码。通常,您可以通过menuconfig更改选项。否则,您的问题将由
man ld
回答。例如,kbuild系统应通过menuconfig和.config变量确定您的CPU类型,并使用适当的
-march
-mfpu
选项。在支持多台机器的情况下,使用其他选项将最低基础机器与特定于机器/arch的文件一起使用。此问题是否特定于arm?公认的答案不是。我们可以删除标签吗?只删除一个(
-Wl,-O1
)标志是否可以让事情正常运行?@EtanReisner我已经尝试删除(-Wl,-01),一个