设为首页 加入收藏

TOP

gcc编译过程简述(三)
2014-03-10 12:52:22 来源: 作者: 【 】 浏览:270
Tags:gcc 编译 过程 简述

 

  编译器ccl 将文本文件hello.i 翻译为hello.s,这个文件里面包含一个汇编程序,如下

  .file "hello.c"

  .section .rodata

  .LC0:

  .string "hello, world"

  .text

  .globl main

  .type main, @function

  main:

  .LFB0:

  .cfi_startproc

  pushl %ebp

  .cfi_def_cfa_offset 8

  .cfi_offset 5, -8

  movl %esp, %ebp

  .cfi_def_cfa_register 5

  andl $-16, %esp

  subl $16, %esp

  movl $.LC0, (%esp)

  call puts

  leave

  .cfi_restore 5

  .cfi_def_cfa 4, 4

  ret

  .cfi_endproc

  .LFE0:

  .size main, .-main

  .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"

  .section .note.GNU-stack,"",@progbits

  汇编语言是非常有用的,因为它将不同高级语言的不同编译器提供了通用的输出语言。例如,C和Fortran 的在此步编译产生的输出文件都是一样的汇编语言。

  第三步、汇编阶段

  执行命令: gcc -o hello.o -c hello.s

  或者 as -o hello.o hello.s

  汇编器as 将hello.s 翻译成机器语言保存在hello.o 中。这是个二进制文件,用命令hexdump hello.o 打开如下

  0000000 457f 464c 0101 0001 0000 0000 0000 0000

  0000010 0001 0003 0001 0000 0000 0000 0000 0000

  0000020 011c 0000 0000 0000 0034 0000 0000 0028

  0000030 000d 000a 8955 83e5 f0e4 ec83 c710 2404

  0000040 0000 0000 fce8 ffff c9ff 00c3 6568 6c6c

  0000050 2c6f 7720 726f 646c 0000 4347 3a43 2820

  0000060 6255 6e75 7574 4c2f 6e69 7261 206f 2e34

  0000070 2e36 2d33 7531 7562 746e 3575 2029 2e34

  0000080 2e36 0033 0014 0000 0000 0000 7a01 0052

  0000090 7c01 0108 0c1b 0404 0188 0000 001c 0000

  00000a0 001c 0000 0000 0000 0017 0000 4100 080e

  00000b0 0285 0d42 5305 0cc5 0404 0000 2e00 7973

  00000c0 746d 6261 2e00 7473 7472 6261 2e00 6873

  00000d0 7473 7472 6261 2e00 6572 2e6c 6574 7478

  00000e0 2e00 6164 6174 2e00 7362 0073 722e 646f

  00000f0 7461 0061 632e 6d6f 656d 746e 2e00 6f6e

  0000100 6574 472e 554e 732d 6174 6b63 2e00 6572

  0000110 2e6c 6865 665f 6172 656d 0000 0000 0000

  0000120 0000 0000 0000 0000 0000 0000 0000 0000

  *

  0000140 0000 0000 001f 0000 0001 0000 0006 0000

  0000150 0000 0000 0034 0000 0017 0000 0000 0000

  0000160 0000 0000 0004 0000 0000 0000 001b 0000

  0000170 0009 0000 0000 0000 0000 0000 03e8 0000

  0000180 0010 0000 000b 0000 0001 0000 0004 0000

  0000190 0008 0000 0025 0000 0001 0000 0003 0000

  00001a0 0000 0000 004c 0000 0000 0000 0000 0000

  第四步、链接阶段

  执行命令: gcc -o hello hello.o

  或者 ld -o hello hello.o

  注意!hello程序调用了printf 函数,这个函数是标准C库中的一个函数,他保存在一个名为printf.o 的文件中,这个文件必须以某种方式合并到我们的hello.o的程序中。

  链接器ld 负责处理这种合并。结果得到hello 可执行文件,可以被加载到内存中由系统执行。

  ./hello

  总结

  编译器的编译过程:

  源文件-->预处理-->编译/优化-->汇编-->链接-->可执行文件。

  平常用的最多、看起来一句命令就搞定的一次编译背后其实非常不简单。此博作简单记录,能力到了之后再做深入分析。

      

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c++ 创建socket server 下一篇实现单实例多线程安全API问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·HTTPS 详解一:附带 (2025-12-26 02:20:37)
·TCP/IP协议到底在讲 (2025-12-26 02:20:34)
·TCP和UDP在socket编 (2025-12-26 02:20:32)
·有没有适合新手练习 (2025-12-26 01:48:47)
·用清华镜像网怎么下 (2025-12-26 01:48:44)