新建一个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是可执行程序? |