3

我正在尝试为 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-neon-oe-linux-gnueabi

  • 回声 $ARCH=手臂

  • 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 command”时,出现以下错误:

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: export LDFLAGS='',然后,make 命令起作用,我得到模块 kaodv.ko。但是当我将它插入我的 ARM 进行检查时,它不起作用。它实际上冻结了我的终端

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

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

谢谢 !!

4

2 回答 2

13

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

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

于 2014-08-20T15:33:41.957 回答
1

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

于 2014-08-20T14:31:37.407 回答