【发布时间】:2020-10-17 05:11:50
【问题描述】:
我对我们为什么使用名称修饰的理解是汇编器和链接器只能处理 C 标识符。 “int foo::bar::baz<spam::eggs>(const MoreSpam&)”不能被任何现有的汇编器用作标签,并且现有的链接器不会将其识别为有效的函数签名,因此它变成了类似于“_ZN3foo3bar3bazIN4spam4eggsEEEiRK8MoreSpam”的东西,即(或多或少)一个有效的 C 标识符。
但这似乎是我们工具的一个相对微不足道的限制。我们不能或不编写汇编器和链接器有什么充分的理由,其中有这样的东西:
int foo::bar::baz<spam::eggs>(MoreSpam const&):
; opcodes go here
ret
是否允许?
【问题讨论】:
-
在一天结束的时候,你可以做任何你想做的事(TI 和 Weird Al 版本都将被接受),但必须有人坐下来做这项工作。
-
汇编器必须匹配工具。不同的系统会以不同的方式进行处理。
-
嗯,不确定我是否完全理解您的问题?如果我声明
int foo::bar::baz<spam::eggs>(MoreSpam const&),我需要能够从 C 上下文中调用它。您会使用哪种语法(在 C 中)? -
Go 就像你说的那样,如果你正确地转义符号名称,你可以使用 UNIX 汇编器为你的符号命名。名称修改的要点是,有足够多的汇编程序不支持奇怪命名的符号,因此使用更常见的符号名称可以更容易地在汇编程序能力较差的平台上实现 C++。
-
对于汇编程序,如果您知道符号名称是没有空格的字符串,并且由不包含可能与其他语法元素混淆的字符的字符集构建,则解析会更容易。考虑像@987654325@ 这样的行。逗号不再总是分隔两个指令操作数,
&可能并不总是按位与运算符。您的汇编器现在需要能够解析任意 C++ 类型语法,这比典型的汇编器解析器需要的要复杂得多。
标签: c++ assembly name-mangling symbol-table object-code