我似乎在 Windows 机器上遇到了 ARM-Linux 交叉编译的奇怪异常。我正在使用从 Mentor Graphic 网站获得的 Sourcery CodeBench Lite Edition (arm-none-linux-gnueabi-gcc)。
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
之前,我使用 arm-linux 编译器 (sudo apt-get install g++-arm-linux-gnueabi -y || gcc-arm-linux-gnueabi) 在 Ubuntu 机器上构建了我的代码。这些工具在这里工作正常,我可以构建目标文件并将它们链接在一起没有问题。
问题是当我在 Windows 中进行 ARM-Linux 交叉编译时……更具体地说,是链接阶段。这是我的 make 文件中的链接器命令
%.elf: $(OBJ_C_OMAP)
@echo "linking to make ELF"
@echo $(OBJ_C_OMAP)
@echo "-------------------------------"
$(CC) $(CFLAGS) $(OBJ_C_OMAP) --output $@ $(LDFLAGS)
OBJ_C_OMAP 包含所有目标文件及其完整路径的列表,CFLAGS 是一组编译器标志,LDFLAGS 是一个链接器标志。当它到达这一点时,链接器会搅动并最终抛出一个错误:
<full_path_to_an_object_file>: No such file or directory
检查 <full_path_to_an_object_file>
时似乎缺少一个字符。如果我将此字符串与 @echo $(OBJ_C_OMAP) 给我们的字符串进行比较,则存在不匹配,$(OBJ_C_OMAP) 变量包含正确的路径,但无论出于何种原因,链接器都会错误地解释它。举个例子:
/ad2_ra/ap/modules/gps/gps_ubx_ucenter.o: 没有那个文件或目录
当$(OBJ_C_OMAP)中指定的目录显示时
/ad2_raw/ap/modules/gps/gps_ubx_ucenter.o
在此示例中,缺少“w”字符。
除了这个奇怪的行为之外,如果我从列表中删除这个目标文件,问题仍然存在于另一个 .o 文件(从路径中删除的另一个字符)。就好像我可以传入多少个 obj 文件有一些限制,一旦达到一定数量的要传入的 obj 文件,它就会开始从路径中删除字符并输出错误。
这可能是此编译器(我正在使用)的 Lite 版本中的错误或某些限制。另请注意,我链接了相当“少”的对象(大约 66 个文件),我不确定在为这个编译器链接这么多对象时是否需要特别考虑。
感谢帮助,谢谢
最佳答案
我四处搜索,发现使用 avr-gcc 向 Atmel 报告了一个非常相似的问题:
http://asf.atmel.com/bugzilla/show_bug.cgi?id=1965
问题似乎是 Windows 的每个命令行只能接受 8191 个字符。您的链接步骤命令行调用是否超过该限制? ( http://support.microsoft.com/kb/830473 )
关于linux - 链接器在传递给它的目标文件上删除字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20777521/