2015-11-05 30 views
1

我正在使用由GCC ARM Embedded提供的工具链。看来ld(4.9-2015-q3-update)无法正确处理通配符(*)与Windows路径。通配符在Mingw中不起作用(Windows)GNU ld脚本

例如,下面的代码片段

.foo_v0 { obj\*(.s_foo_v0) } 

不会找到目录下OBJ文件,并.foo_v0将一无所获。这里是来自mapfile的报告:

.s_foo_v0  0x00008664  0x1c 
.s_foo_v0  0x00008664  0x1c obj\test\foo.o 
       0x00008664    foo_v0 

.foo_v0   0x00008680  0x0 
obj\test\*(.s_foo_v0) 
       0x00008680    PROVIDE (__load_start_foo_v0, LOADADDR (.foo_v0)) 
       0x00008680    PROVIDE (__load_stop_foo_v0, (LOADADDR (.foo_v0) + SIZEOF (.foo_v0))) 

一切工作正常Cygwin,但是,只需要使用斜杠而不是反斜杠。

这是一个已知的问题?还是有解决方法?

+0

即使您不使用Cygwin环境,您是否尝试过使用斜杠而不是反斜杠? –

+0

它也行不通。 – chenwj

+1

也许尝试将反斜杠加倍以避免它:'.foo_v0 {obj \\ *(。s_foo_v0)}' –

回答

1

加倍反斜杠解决了这个问题。

.foo_v0 { obj\\*(.s_foo_v0) } 

这里是映射文件的报告,

.foo_v0   0x00008664  0x1c 
obj\\*(.s_foo_v0) 
.s_foo_v0  0x00008664  0x1c obj\test\foo.o 
       0x00008664    foo_v0 
       0x00008664    PROVIDE (__load_start_foo_v0, LOADADDR (.foo_v0)) 
       0x00008680    PROVIDE (__load_stop_foo_v0, (LOADADDR (.foo_v0) + SIZEOF (.foo_v0))) 

看来第一个反斜杠转义后者,使后者也不会逃避通配符。