我正在尝试为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编译中
谢谢!
答案 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
,它仍应有效。