LDFLAGS的意义是什么?

时间:2014-08-20 14:26:44

标签: linux-kernel cross-compiling ldflags

我正在尝试为ARM linux编译AODV。我使用SabreLite作为内核版本3.0.35_4.1.0的板。值得一提的是,我正在使用openembedded为我的主板创建Linux发行版。 AODV源代码(http://sourceforge.net/projects/aodvuu/)有一个README文件,它提供了一些关于如何在ARM上安装它的指示。  (http://w3.antd.nist.gov/wctg/aodv_kernel/kaodv_arm.html)。

我能够升级makefile以便与2.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 / sysroots / cortexa9hf-VFP氖-OE-Linux的gnueabi

  • echo $ ARCH = arm

  • echo $ CFLAGS:O2 -pipe -g -feliminate-unused-debug-types

  • echo $ LD: arm-oe-linux-gnueabi-ld --sysroot = / usr / local / oecore-x86_64 / sysroots / 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_emulation/AODV/aodv-uu/lnx/kaodv.o

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

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

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

无论如何,为了解决上面的错误,我试着像这样撤回LDFLAGS: 导出LDFLAGS ='', 然后,make命令工作,我得到模块kaodv.ko。但是当我将它插入我的ARM进行检查时,它不起作用。它实际上冻结了我的终端

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

我的第二个问题是,LDFLAGS可能具有什么价值 在ARM编译中

谢谢!

2 个答案:

答案 0 :(得分:8)

  

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 --as-needed --as-needed

(最后一个论点的重复可能毫无意义但是良性)

答案 1 :(得分:1)

-O1是一个告诉链接器进行优化的选项。我相信它是新的东西,你的链接器可能会略微过时。尝试删除-Wl,-O1,它仍应有效。