Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++;计划';s程序集输出完全是.ascii,没有程序集代码?_C++_Assembly_Gcc - Fatal编程技术网

C++ 为什么我的C++;计划';s程序集输出完全是.ascii,没有程序集代码?

C++ 为什么我的C++;计划';s程序集输出完全是.ascii,没有程序集代码?,c++,assembly,gcc,C++,Assembly,Gcc,我用CMake编译C++文件到静态库中,我通过添加-s- fVBUOSE ASM标志来修改CGmake生成的Mag文件,以获得GCC输出,但是结果.CPP.S文件中填充了看起来像十六进制数据的ASCII线,并且没有汇编指令,例如: .ascii "\346+\274\004@\226\032!n\247<)\212\264\205\377*\204\275\364e" .ascii "\314\026\270vi\263\373\327\n\367$\33

我用CMake编译C++文件到静态库中,我通过添加-s- fVBUOSE ASM标志来修改CGmake生成的Mag文件,以获得GCC输出,但是结果.CPP.S文件中填充了看起来像十六进制数据的ASCII线,并且没有汇编指令,例如:

.ascii  "\346+\274\004@\226\032!n\247<)\212\264\205\377*\204\275\364e"
.ascii  "\314\026\270vi\263\373\327\n\367$\332\035\364N\212\316\254\324"

.ascii”\346+\274\004@\226\032!n\247您可能在编译时启用了链接时间优化(
gcc-flto
),这使得“fat”对象文件与常规asm一起还包含gcc的程序逻辑中间表示。(因此,整个程序优化可以在链接时进行,允许跨源文件进行内联和进一步优化,这在只有原型可见时是不可能的。)或者,如果您链接到一个不知道LTO的链接器,它将忽略LTO部分,而只使用常规机器代码部分

GCC使用带有八进制转义的
.ascii
作为一种紧凑的方式(在asm源代码中),以汇编程序不知道的格式(GIMPLE字节码)发出原始二进制文件。

另一种选择是
.byte 12,34,
,它是每个输出字节2到4个源字节,类似于带八进制的ASCII,它给出1到4(1表示可打印ASCII范围内的任何字节)

.long 0xabcd220c,0x…
.quad
将更接近每个输出字节2个asm源字节


这一效率考虑仅适用于GCC将作为
馈送到的
.s
临时文件;在
.o
中,数据将以二进制格式(在具有特殊名称的对象文件部分中)GCC希望一种格式可以很快地在GCC中串行化,并能快速地将汇编程序解析并转换成字节。大概是“代码引用”的双引号字符串。ASCII 使解析简单。

显示C++源,以及G+版本。如果可以复制,请检查GoDBORT.ORG。如果您对对象文件进行了反编译,会发生什么?h
nm
objdump
-甚至在这种情况下只是hexdump?它们是相同的字符串吗?还要确保您没有使用LTO。这似乎会产生您描述的输出。@Jester:这是有道理的,GCC可能使用
.ascii
作为一种紧凑的方式,以汇编程序不支持的格式发出原始二进制文件现在关于(GIMPLE)。另一种选择是
.byte 12,34,
,它是每个输出字节2到4个源字节,类似于带八进制的ASCII。或
。long
。quad
将更接近每个输出字节2个源字节。链接时间优化,通常使用
-flto
启用。在您的应用程序中应该会看到大量
lto
字符串
.s
文件。