Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们为什么不编写能处理C++标识符的汇编器和链接器呢?_C++_Assembly_Name Mangling_Symbol Table_Object Code - Fatal编程技术网

我们为什么不编写能处理C++标识符的汇编器和链接器呢?

我们为什么不编写能处理C++标识符的汇编器和链接器呢?,c++,assembly,name-mangling,symbol-table,object-code,C++,Assembly,Name Mangling,Symbol Table,Object Code,我对为什么使用名称篡改的理解是,汇编程序和链接器只能处理C标识符。int-foo::bar::bazconst-MoreSpam&不能被任何现有的汇编程序用作标签,并且现有的链接器不会将其识别为有效的函数签名,因此它变成了类似于zn3foo3bar3bazin4spam4eggseerk8morespam的东西,这或多或少是一个有效的C标识符 但这似乎是我们工具的一个相对微不足道的限制。有没有什么好的理由让我们不能或不写一个汇编器和链接器,其中包含如下内容: int foo::bar::baz&

我对为什么使用名称篡改的理解是,汇编程序和链接器只能处理C标识符。int-foo::bar::bazconst-MoreSpam&不能被任何现有的汇编程序用作标签,并且现有的链接器不会将其识别为有效的函数签名,因此它变成了类似于zn3foo3bar3bazin4spam4eggseerk8morespam的东西,这或多或少是一个有效的C标识符

但这似乎是我们工具的一个相对微不足道的限制。有没有什么好的理由让我们不能或不写一个汇编器和链接器,其中包含如下内容:

int foo::bar::baz<spam::eggs>(MoreSpam const&):
    ; opcodes go here
    ret
可以使用int-foo::bar::bazconst-MoreSpam&作为GNU汇编程序的标识符,只需将名称加引号:

intfoo::bar::bazMoreSpam常量&: ret $as-o test.o test.s $nm测试.o 0000000000000000吨整数foo::bar::bazMoreSpam const& $ld test.o ld:警告:找不到输入符号\u start;默认为0000000000 401000 每月$nm 0000000000 402000吨bss启动 0000000000 402000吨电子数据 0000000000 402000吨端 0000000000 401000吨整数foo::bar::bazMoreSpam const& 开始

一个问题是,除了在很多上下文中处理空间和符号的符号之外,还存在一个问题,即不是所有的C++被忽略的标识符都可以明确地表示C++源片段。同一C++符号可以有多个被破坏的表示,一些被破坏的符号没有C++表示。

例如,GNU C++编译器使用的ItAuthC++ C++ ABI取决于编译器生成构造函数的变体。类似地,有三种不同的方法可以损坏给定析构函数的名称。符号_ZN3fooC1Ev和_ZN3fooC2Ev都作为foo::foo使用,并且都可以存在于同一个程序中

当然,您可以发明新的类似C++的语法来表示这些东西,但您只是发明了更详细的方式来处理符号

最后,也许C++编译器把它们的名字拼错的最重要的原因是他们可以使用各种工具。尽管GNU C++编译器可以在除了GAS以外的其他汇编语言中使用,但是

< P>你可以使用int fo::BA::BZCONSTMORMOSPAM和GNU汇编程序的标识符,你只需要把这个名字放在引号:

intfoo::bar::bazMoreSpam常量&: ret $as-o test.o test.s $nm测试.o 0000000000000000吨整数foo::bar::bazMoreSpam const& $ld test.o ld:警告:找不到输入符号\u start;默认为0000000000 401000 每月$nm 0000000000 402000吨bss启动 0000000000 402000吨电子数据 0000000000 402000吨端 0000000000 401000吨整数foo::bar::bazMoreSpam const& 开始

一个问题是,除了在很多上下文中处理空间和符号的符号之外,还存在一个问题,即不是所有的C++被忽略的标识符都可以明确地表示C++源片段。同一C++符号可以有多个被破坏的表示,一些被破坏的符号没有C++表示。

例如,GNU C++编译器使用的ItAuthC++ C++ ABI取决于编译器生成构造函数的变体。类似地,有三种不同的方法可以损坏给定析构函数的名称。符号_ZN3fooC1Ev和_ZN3fooC2Ev都作为foo::foo使用,并且都可以存在于同一个程序中

当然,您可以发明新的类似C++的语法来表示这些东西,但您只是发明了更详细的方式来处理符号


最后,也许C++编译器把它们的名字拼错的最重要的原因是他们可以使用各种工具。尽管GNU C++编译器可以在除了GAS之外的其他汇编语言中使用。

在一天结束的时候,你可以做任何你喜欢的TI,而奇怪的AL版本都会被接受,但是有人必须坐下来做这项工作。汇编程序必须匹配工具。不同的系统会以不同的方式损坏。嗯,不确定我是否完全理解你的问题?如果我声明int-foo::bar::bazMoreSpam const&,我需要能够从C-context调用它。你会在C中使用哪种语法?例如,Go是否像你说的那样,IIRC如果你正确地转义符号名,你可以用UNIX汇编程序给你的符号命名。名称的主要问题在于,有足够多的汇编程序不支持奇怪的命名符号,因此使用更常见的符号名使得在具有不太有能力的汇编程序的平台上实现C++更容易。如果对于汇编程序,如果知道符号名称是没有空格的字符串,则解析更容易。从不包含可能与其他语法元素混淆的字符的字符集构建。考虑一个像MOV Reg,Foint,int & 0xFFFF这样的行。不再是逗号总是分隔两个指令的情况
运算操作数和&不一定总是按位and运算符。你的汇编程序现在需要能够解析任意的C++类型语法,这比一般的汇编分析器需要复杂得多。在一天结束的时候,你可以做任何你喜欢的TI,而奇怪的AL版本都会被接受。但总得有人坐下来做这项工作。装配工必须匹配工具。不同的系统会以不同的方式损坏。嗯,不确定我是否完全理解你的问题?如果我声明int-foo::bar::bazMoreSpam const&,我需要能够从C-context调用它。你会在C中使用哪种语法?例如,Go是否像你说的那样,IIRC如果你正确地转义符号名,你可以用UNIX汇编程序给你的符号命名。名称的主要问题在于,有足够多的汇编程序不支持奇怪的命名符号,因此使用更常见的符号名使得在具有不太有能力的汇编程序的平台上实现C++更容易。如果对于汇编程序,如果知道符号名称是没有空格的字符串,则解析更容易。从不包含可能与其他语法元素混淆的字符的字符集构建。考虑一个像MOV Reg,Foint,int & 0xFFFF这样的行。不再是逗号总是分隔两个指令操作数,并且&可能不总是按位and运算符。现在,你的汇编程序需要能够解析任意的C++类型语法,这比一般的汇编解析器需要复杂得多。