【问题标题】:Wildcard doesn't work in Mingw (Windows) GNU ld script通配符在 Mingw (Windows) GNU ld 脚本中不起作用
【发布时间】:2016-02-05 22:55:51
【问题描述】:

我使用的是GCC ARM Embedded提供的工具链。似乎 ld (4.9-2015-q3-update) 无法正确处理带有 Windows 路径的通配符 (*)。

比如下面的代码sn-p

.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 上一切正常,但是,只需要使用斜杠而不是反斜杠。

这是一个已知问题?或者有什么解决方法?

【问题讨论】:

  • 您是否尝试过使用斜杠而不是反斜杠,即使您不使用 Cygwin 环境?
  • 它也不起作用。
  • 也许可以尝试加倍反斜杠来转义它:.foo_v0 { obj\\*(.s_foo_v0) }
  • 将反斜杠加倍有效。如果我只使用一个反斜杠,它会转义通配符,所以我需要另一个反斜杠来转义后一个?
  • 好像是这样。太糟糕了,它不会使用正斜杠匹配。 Windows 上的许多 GNU 工具似乎都可以使用正斜杠作为路径分隔符。这也有助于提高便携性。

标签: gcc cross-compiling ld binutils


【解决方案1】:

加倍反斜杠可以解决问题。

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

这是来自 mapfile 的报告,

.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)))

似乎第一个反斜杠转义了后一个,因此后一个不会转义通配符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多