Linux 链接器是否在传入的对象文件上删除字符?

Linux 链接器是否在传入的对象文件上删除字符?,linux,gcc,linker,arm,cross-compiling,Linux,Gcc,Linker,Arm,Cross Compiling,我似乎在Windows机器上使用ARM-Linux交叉编译时遇到了一个奇怪的异常。我使用的是从Mentor Graphic网站获得的Sourcery CodeBench Lite版(arm none linux gnueabi gcc) 以前,我使用arm linux编译器(sudo apt get install g++-arm-linux-gnueabi-y | | gcc-arm-linux-gnueabi)在Ubuntu机器上构建了代码。这些工具在这里工作得很好,我可以构建对象文件并将

我似乎在Windows机器上使用ARM-Linux交叉编译时遇到了一个奇怪的异常。我使用的是从Mentor Graphic网站获得的Sourcery CodeBench Lite版(arm none linux gnueabi gcc)

以前,我使用arm linux编译器(sudo apt get install g++-arm-linux-gnueabi-y | | gcc-arm-linux-gnueabi)在Ubuntu机器上构建了代码。这些工具在这里工作得很好,我可以构建对象文件并将它们链接在一起,没有问题

问题是当我在Windows中进行ARM-Linux交叉编译时。。更具体地说,是链接阶段。这是我的make文件中的linker命令

  %.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
:没有这样的文件或目录
检查
时,似乎缺少一个字符。如果我将此字符串与@echo$(OBJ_C_OMAP)提供的内容进行比较,就会发现不匹配,$(OBJ_C_OMAP)变量包含正确的路径,但无论出于何种原因,链接器都会错误解释它。作为发生情况的一个例子:

/ad2_ra/ap/modules/gps/gps_ubx\u ucenter.o:没有这样的文件或目录

当$(OBJ_C_OMAP)中指定的目录显示时

/ad2_raw/ap/modules/gps/gps_ubx_ucenter.o

在本例中,缺少“w”字符

除了这种奇怪的行为之外,如果我从列表中删除此对象文件,问题还会在另一个.o文件上继续存在(从路径中删除了另一个字符)。这就好像我可以传入多少obj文件有一些限制,一旦它到达一定数量的obj文件要传入,它就开始从路径中删除字符并排除错误

这可能是一个bug,也可能是这个编译器(我正在使用的)Lite版本中的一些限制。还要注意的是,我正在链接相当多的对象(大约66个文件),我不确定在为这个编译器链接这么多对象时是否需要特别考虑


感谢您的帮助

我四处搜索,发现了一个与avr gcc报告给Atmel的极其相似的问题:


问题似乎是Windows每个命令行只能接受8191个字符。链接步骤命令行调用是否超过该限制?()

难以置信。就像你说的,Windows,你当时试过运行某种防病毒软件吗

“链接器在传递给它的对象文件上删除字符?”这就是你如何调用帖子的。但是,阅读它,很明显,链接器是最不应该受到责备的,因为你向它传递了错误的论点。那可能是gnu制造的,我会先检查一下

绝对要确保你有最新的款式。它确实在许多UNIX系统上为我节省了很多时间(对不起,从来没有Windows)。那些日子我一直在唠叨gnu的人。他们很正常,如果你真的说服他们,他们会打补丁的。当你发现这样一个bug时,你应该提交一个bug,程序员协会会为此而感激的


另一件事,是你正在建造的环境。这也可能是罪魁祸首,Cygwin或其他什么。也就是说,要么升级,要么再次向他们提交bug。因为你没有经验的事情永远不会发生

这看起来确实像是一个依赖于命令行长度的bug。作为一种解决方法,您可以使用gcc的选项从文件中读取命令行选项,从而缩短命令行,例如。g

       @echo $(OBJ_C_OMAP) >obj.txt
       @echo "-------------------------------"
       $(CC) $(CFLAGS) @obj.txt --output $@ $(LDFLAGS) 

作为一种解决方法,gnumake可以在不调用外部命令的情况下将任意文本写入文件。这是通过使用完成的,它有针对此类情况的特定示例代码。

在windows上,这仍然不起作用,因为您得到了相同的8191行长度限制。唯一的区别是您在@echo命令中获得它,而不是在编译器中。也许你可以从中获得一些灵感,看看如何解决这个问题。这是否有效取决于@echo命令的结果长度,它可能比原来的$(CC)命令短。还有其他方法可以将所有对象文件的列表放入一个文件中。