C/C++学习 - gcc编译过程查看汇编代码

本文详细介绍了GCC编译器及其参数使用方法,通过实例演示了从预编译到生成可执行文件的整个过程,并解释了各阶段产生的文件内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GCC

gcc大家都很熟悉,是个编译器,功能强大,全称是:GUN GCC。

平时大家都简单的称为:GCC, 功能强大,能够编译很多的语言。包括:c, c++, java, ada等…

GCC参数

gcc平时有很多参数,在平时我编译小程序的时候,都直接gcc -o object source.c就可以了。

但是有一次我想查看我同样目的但是不同写法的两个代码是执行效率上是否有差别。所以我就查了下gcc编译过程中的汇编代码的参数。

参数说明
-c只编译不链接,生成*.o文件
-S生成汇编代码*.s文件
-E预编译 生成*.i文件
-g在可执行程序里包含了调试信息,可用 gdb 调试
-o把输出文件输出到指定文件里
-static链接静态链接库
-library链接名为library的链接库

举例

使用方法比较简单:

  • 首先预编译:
gcc -E hello.c -o hello.i

这样我们就得到了一个预编译的文件。
里面是一些:

# 1 "main.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 175 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.cpp" 2



# 1 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream" 1 3
# 37 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iostream" 3
# 1 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config" 1 3
# 16 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config" 3
# 226 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config" 3
typedef __char16_t char16_t;
typedef __char32_t char32_t;
# 349 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__config" 3

...

如这样的东西,就是把一些头文件放到里面神马的。

  • 然后可以链接:
gcc -S hello.i -o hello.s

里面就是汇编代码了。如下:

    .section    __TEXT,__text,regular,pure_instructions
    .section    __TEXT,__const
    .align  4
LCPI0_0:
    .long   1127219200              ## 0x43300000
    .long   1160773632              ## 0x45300000
    .long   0                       ## 0x0
    .long   0                       ## 0x0
LCPI0_1:
    .quad   4841369599423283200     ## double 4.503600e+15
    .quad   4985484787499139072     ## double 1.934281e+25
    .section    __TEXT,__text,regular,pure_instructions
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp

...

原谅我对汇编比较白痴,我只能看懂很少一点点汇编代码,想学都拖了好久了 TT

  • 然后进行编译,不链接生成.o文件。
gcc -c hello.s -o hello.o

这个时候已经没办法用文本编辑器打开查看了。已经是二进制文件了。打开也都是0 1
我用sublime text 2 打开后是一堆16进制的代码了。

  • 然后生成可执行文件:
gcc hello.o -o hello

这个时候,链接成功,编译为可执行文件了。

执行的时候只用./hello就可以了。

### LoongArch GNU 工具链配置详情及 GCC 版本信息 #### 配置细节 LoongArch GNU 工具链的目标架构为 `loongarch64-linux-gnu`,其对应的 GCC 编译器版本为 8.3.0。此工具链支持龙芯自主指令集体系结构(LoongArch),并针对该架构进行了优化[^1]。 在构建过程中,GCC 的配置选项通常会指定目标平台以及所需的特性支持。对于 LoongArch 架构而言,常见的配置命令可能如下所示: ```bash ./configure --target=loongarch64-linux-gnu \ --prefix=/opt/loongson/toolchain \ --enable-languages=c,c++ \ --disable-multilib \ --with-system-zlib \ --with-gmp=/usr/local/gmp \ --with-mpfr=/usr/local/mpfr \ --with-mpc=/usr/local/mpc \ --with-isl=/usr/local/isl ``` 上述配置说明了以下几点: - 使用 `--target=loongarch64-linux-gnu` 来定义目标平台。 - 设置安装路径为 `/opt/loongson/toolchain`。 - 启用了 C 和 C++ 支持。 - 关闭多库模式以减少复杂度。 - 指定了依赖项的位置,例如 GMP、MPFR、MPC 和 ISL 库。 #### GCC 版本信息 所使用的 GCC 版本为 8.3.0,这是由官方预先编译好的二进制文件提供[^4]。通过解压预编译的工具链包即可获得完整的开发环境。例如,在 Linux 下可以通过以下命令完成解压操作: ```bash tar -xvf loongson-gnu-toolchain-8.3-src-loongarch64-linux-gnu-rc1.2.tar ``` 这一步骤将提取出所有必要的组件,包括编译器、汇编器和链接器等工具。 此外,动态链接库的信息也表明系统中存在兼容的 libc 实现。例如,标准 C 库的共享对象文件位于 `/lib/x86_64-linux-gnu/libc.so.6` 中[^3]。尽管此处提到的是 x86_64 平台上的实现,但在 LoongArch 上也会有类似的对应版本。 --- ### 总结 综上所述,LoongArch GNU 工具链基于 GCC 8.3.0 开发,并专门适配于 `loongarch64-linux-gnu` 目标平台。它不仅提供了高效的编译能力,还包含了经过验证的标准库支持。用户可以按照既定流程下载并部署这一工具链至本地环境中,从而开展面向 LoongArch 架构的应用程序开发工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值