c++ - 带有调试选项的 gcc 编译阶段

标签 c++ gcc assembly compiler-construction gdb

我正在尝试研究与 GCC 不同的编译阶段。

手动分阶段编译

$ g++ -E main.cpp -o main.i                  # I1

$ g++ -S main.i -o main.s                    # S1
$ g++ -S main.i -o main.debug.s -ggdb -g3    # S2

$ as main.s       -o main.as.o               # O1
$ as main.debug.s -o main.as.debug.o         # O2

然后完全用“g++ only”再次编译

$ g++ -c main.cpp -o main.gcc.o                  # G1
$ g++ -c main.cpp -o main.gcc.debug.o -ggdb -g3  # G2

最后

ma​​in.as.o 与没有调试信息的 ma​​in.gcc.o 相同

但是

ma​​in.as.debug.oma​​in.gcc.debug.o

有很大不同

为什么?我错过了什么吗?

这里是工具版本

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++-7
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/7.2.0/libexec/gcc/x86_64-apple-darwin13.4.0/7.2.0/lto-wrapper
Target: x86_64-apple-darwin13.4.0
Configured with: ../configure --build=x86_64-apple-darwin13.4.0 --prefix=/usr/local/Cellar/gcc/7.2.0 --libdir=/usr/local/Cellar/gcc/7.2.0/lib/gcc/7 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-7 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --enable-checking=release --with-pkgversion='Homebrew GCC 7.2.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --disable-nls
Thread model: posix
gcc version 7.2.0 (Homebrew GCC 7.2.0)

$ as -v
Apple Inc version cctools-862, GNU assembler version 1.38

更新

此处使用 -v 和 -save-temps 选项显示等效命令

#####

# $ g++ -E main.cpp -o main.i                # I1
$ cc1plus -E -quiet -v -D__DYNAMIC__ main.cpp -o main.i -fPIC -mmacosx-version-min=10.9.4 -mtune=core2

#####

# $ g++ -S main.i -o main.s                  # S1
$ cc1plus -fpreprocessed main.i -fPIC -quiet -dumpbase main.i -mmacosx-version-min=10.9.4 -mtune=core2 -auxbase-strip main.s -version -fdump-tree-all-graph -o main.s

#####

# $ g++ -S main.i -o main.debug.s -ggdb -g3  # S2
$ cc1plus -fpreprocessed main.i -fPIC -quiet -dumpbase maini -mmacosx-version-min=10.9.4 -mtune=core2 -auxbase-strip main.debug.s -ggdb -g3 -version -o main.debug.s

#####

$ as main.s       -o main.as.o               # O1
$ as main.debug.s -o main.as.debug.o         # O2

#####

# g++ -c main.cpp -o main.gcc.o                  # G1

$ cc1plus -E -quiet -v -D__DYNAMIC__ main.cpp -fPIC -mmacosx-version-min=10.9.4 -mtune=core2 -fpch-preprocess -o main.ii

$ cc1plus -fpreprocessed main.ii -fPIC -quiet -dumpbase main.cpp -mmacosx-version-min=10.9.4 -mtune=core2 -auxbase-strip main.gcc.o -version -o main.s

$ as -arch x86_64 -v -force_cpusubtype_ALL -o main.gcc.o main.s

#####

# g++ -c main.cpp -o main.gcc.debug.o -ggdb -g3  # G2

$ cc1plus -E -quiet -v -dD -D__DYNAMIC__ main.cpp -fPIC -mmacosx-version-min=10.9.4 -mtune=core2 -ggdb -g3 -fworking-directory -fpch-preprocess -o main.ii

$ cc1plus -fpreprocessed main.ii -fPIC -quiet -dumpbase main.cpp -mmacosx-version-min=10.9.4 -mtune=core2 -auxbase-strip main.gcc.debug.o -ggdb -g3 -version -o main.s

$ as -arch x86_64 -v -force_cpusubtype_ALL -o main.gcc.debug.o main.s

#####

最佳答案

糟糕,这是我的微不足道的失败。

原帖

$ g++ -E main.cpp -o main.i                  # I1

$ g++ -S main.i -o main.s                    # S1
$ g++ -S main.i -o main.debug.s -ggdb -g3    # S2

我还需要使用调试选项调用 -E 并服务于下一阶段....

应该改为...

$ g++ -E main.cpp -o main.debug.i  -ggdb -g3       # I2

$ g++ -S main.debug.i -o main.debug.s -ggdb -g3    # S2'

然后接下来的阶段会生成相同的机器码...

关于c++ - 带有调试选项的 gcc 编译阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47144764/

相关文章:

c++ - 如何在 GCC 中启用 C/C++ "Conditional with Omitted Operand"(又名 Elvis Operator "?:")

xcode - 如何在 OS X 中使用 masm 编译并运行汇编代码?

c++ - 是否可以通过一个模板函数实现按列操作和按行操作?

c++ - 找不到默认构造函数

Cortex R5 - 启动代码

c - 在生成器宏中删除参数

java - 无用的测试指令?

c++ - 无法在 MIPS 中获得正确的输出

c++ - 在 Windows Phone 平台上选择返回 -1 的函数

c++ - QGridLayout 中的 QGridLayout