GCC编译过程_风语者_百度空间
新建一个C文件,hello.c,内容如下:
#include <stdio.h>
int main()
{
printf("hello world!");
}
[root@localhost work]# gcc -c hello.c   // -c只编译,不生成可执行程序
[root@localhost work]# ls
hello.c  hello.o

目标文件比源码要大
[root@localhost work]# ls -l
总计 8
-rw-r--r-- 1 root root  62 02-24 02:41 hello.c
-rw-r--r-- 1 root root 872 02-24 02:41 hello.o

目标文件格式
[root@localhost work]# file hello.o  // 可重定向,not stripped是什么意思?
hello.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

-s只生成汇编代码
[root@localhost work]# gcc -S hello.c
[root@localhost work]# ls
hello.c  hello.o  hello.s
[root@localhost work]# file hello.s  // 是汇编文本文件
hello.s: ASCII assembler program text
[root@localhost work]# cat hello.s
.file   "hello.c"
.section        .rodata
.LC0:
.string "hello world!"
.text
.globl main
.type   main, @function
main:
leal    4(%esp), %ecx
andl    $-16, %esp
pushl   -4(%ecx)
pushl   %ebp
movl    %esp, %ebp
pushl   %ecx
subl    $4, %esp
movl    $.LC0, (%esp)
call    printf
addl    $4, %esp
popl    %ecx
popl    %ebp
leal    -4(%ecx), %esp
ret
.size   main, .-main
.ident  "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-44)"
.section        .note.GNU-stack,"",@progbits

gcc hello.o和gcc hello.s都可以产生可执行程序


objdump -d a.out可以反编译可执行文件:
[root@localhost work]# objdump -d a.out
a.out:     file format elf32-i386
Disassembly of section .init:
08048250 <_init>:
....

编译产生静态代码
[root@localhost work]# gcc -static hello.c -o hello-static  // 静态代码可以直接执行
[root@localhost work]# ls -l hello-static
-rwxr-xr-x 1 root root 525470 02-24 11:11 hello-static

编译产生共享代码
[root@localhost work]# gcc -shared hello.c -o hello-shared
[root@localhost work]# ls hello-shared -l  // 共享代码需要和其他库连接后方可执行
-rwxr-xr-x 1 root root 4139 02-24 11:12 hello-shared

直接编译的代码,是可执行的:
-rwxr-xr-x 1 root root   4731 02-24 11:16 a.out


GCC是编译器,as是汇编器,ld是连接器
gcc产物目标代码,
as是?
ld是可执行程序?


郑重声明:资讯 【GCC编译过程_风语者_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——