[TOC]
gcc
1、预编译命令:gcc -E
表示只进行预编译,将源文件预编译成 .i
或 .ii
文件
gcc -E hello.c -o hello.i
2、编译命令:gcc -S
,将预编译文件 .i
或 .ii
编译成汇编文件 .s
gcc -S hello.i -o hello.s
也可以直接将源文件编译成汇编文件
gcc -S hello.c -o hello2.s
3、汇编命令:as
,从汇编文件.s
输出目标文件.o
as hello.s -o hello.o
也可以使用 gcc -c
,从源文件(汇编文件)输出目标文件.o
gcc -c hello.c -o hello2.o
gcc -c hello.s -o hello3.o
4、可执行文件:gcc file -o a.out
,生成可以直接执行的文件
gcc hello.c -o hello.out
执行 hello.out
文件
./hello.out
输出结果:Hello World!
file
可以是:hello.i
、hello.s
、hello.o
,从源代码到可执行文件之间的任何一个文件。
clang
objdump
1、查看object文件内容结构:objdump -h SimpleSection.o
$objdump -h SimpleSection.o
SimpleSection.o: file format Mach-O 64-bit x86-64
Sections:
Idx Name Size Address Type
0 __text 00000068 0000000000000000 TEXT
1 __data 00000008 0000000000000068 DATA
2 __cstring 00000004 0000000000000070 DATA
3 __bss 00000004 0000000000000120 BSS
4 __compact_unwind 00000040 0000000000000078 DATA
5 __eh_frame 00000068 00000000000000b8 DATA
2、反汇编代码段:objdump -d SimpleSection.o
反汇编所有的段:objdump -D SimpleSection.o
$objdump -d SimpleSection.o
SimpleSection.o: file format Mach-O 64-bit x86-64
Disassembly of section __TEXT,__text:
_func1:
0: 55 pushq %rbp
1: 48 89 e5 movq %rsp, %rbp
4: 48 83 ec 10 subq $16, %rsp
8: 89 7d fc movl %edi, -4(%rbp)
b: 8b 75 fc movl -4(%rbp), %esi
e: 48 8d 3d 5b 00 00 00 leaq 91(%rip), %rdi
15: b0 00 movb $0, %al
17: e8 00 00 00 00 callq 0 <_func1+0x1c>
1c: 89 45 f8 movl %eax, -8(%rbp)
1f: 48 83 c4 10 addq $16, %rsp
23: 5d popq %rbp
24: c3 retq
25: 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
2f: 90 nop
_main:
30: 55 pushq %rbp
31: 48 89 e5 movq %rsp, %rbp
34: 48 83 ec 10 subq $16, %rsp
38: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)
3f: c7 45 f8 01 00 00 00 movl $1, -8(%rbp)
46: 8b 05 00 00 00 00 movl (%rip), %eax
4c: 03 05 00 00 00 00 addl (%rip), %eax
52: 03 45 f8 addl -8(%rbp), %eax
55: 03 45 f4 addl -12(%rbp), %eax
58: 89 c7 movl %eax, %edi
5a: e8 00 00 00 00 callq 0 <_main+0x2f>
5f: 8b 45 f8 movl -8(%rbp), %eax
62: 48 83 c4 10 addq $16, %rsp
66: 5d popq %rbp
67: c3 retq
3、查看每一个段的内容,结果以16进制显示:objdump -s SimpleSection.o
省略bss段后面的一些无关内容
$objdump -s SimpleSection.o
SimpleSection.o: file format Mach-O 64-bit x86-64
Contents of section __text:
0000 554889e5 4883ec10 897dfc8b 75fc488d
0010 3d5b0000 00b000e8 00000000 8945f848
0020 83c4105d c3662e0f 1f840000 00000090
0030 554889e5 4883ec10 c745fc00 000000c7
0040 45f80100 00008b05 00000000 03050000
0050 00000345 f80345f4 89c7e800 0000008b
0060 45f84883 c4105dc3
Contents of section __data:
0068 54000000 55000000
Contents of section __cstring:
0070 25640a00 %d..
Contents of section __bss:
<skipping contents of bss section at [0120, 0124)>
......
4、查看重定向项:objdump -r SimpleSection.o
$objdump -r SimpleSection.o
SimpleSection.o: file format Mach-O 64-bit x86-64
RELOCATION RECORDS FOR [__text]:
000000000000005b X86_64_RELOC_BRANCH _func1
000000000000004e X86_64_RELOC_SIGNED _main.static_var2
0000000000000048 X86_64_RELOC_SIGNED _main.static_var
0000000000000018 X86_64_RELOC_BRANCH _printf
0000000000000011 X86_64_RELOC_SIGNED __cstring
RELOCATION RECORDS FOR [__compact_unwind]:
0000000000000020 X86_64_RELOC_UNSIGNED __text
0000000000000000 X86_64_RELOC_UNSIGNED __text
5、查看每个段的描述信息:objdump -section-headers SimpleSection.o
$objdump -section-headers SimpleSection.o
SimpleSection.o: file format Mach-O 64-bit x86-64
Sections:
Idx Name Size Address Type
0 __text 00000068 0000000000000000 TEXT
1 __data 00000008 0000000000000068 DATA
2 __cstring 00000004 0000000000000070 DATA
3 __bss 00000004 0000000000000120 BSS
4 __compact_unwind 00000040 0000000000000078 DATA
5 __eh_frame 00000068 00000000000000b8 DATA
6、查看符号表:objdump -t SimpleSection.o
$objdump -t SimpleSection.o
SimpleSection.o: file format Mach-O 64-bit x86-64
SYMBOL TABLE:
000000000000006c l O __DATA,__data _main.static_var
0000000000000120 l O __DATA,__bss _main.static_var2
0000000000000000 g F __TEXT,__text _func1
0000000000000068 g O __DATA,__data _global_init_var
0000000000000030 g F __TEXT,__text _main
0000000000000004 *COM* 00000004 _global_uninit_var
0000000000000000 *UND* _printf
7、查看更多信息:objdump -x SimpleSection.o
可以输出上面的所有信息,还有很多其他信息,例如软件版本信息、虚拟内存、偏移、步长等非常多的信息
file
1、查看文件类型:file [file]
$file hello.c
hello.c: c program text, ASCII text
$file hello.i
hello.i: c program text, ASCII text
$file hello.s
hello.s: assembler source text, ASCII text
$file hello.o
hello.o: Mach-O 64-bit object x86_64
$file hello.out
hello.out: Mach-O 64-bit executable x86_64
$file /bin/bash
/bin/bash: Mach-O 64-bit executable x86_64
size
1、输出object文件的大小:size [file]
$size SimpleSection.o
__TEXT __DATA __OBJC others dec hex
212 12 0 64 288 120
2、输出 Mach-O 分段信息:size -m [file]
$size -m SimpleSection.o
Segment : 292
Section (__TEXT, __text): 104
Section (__DATA, __data): 8
Section (__TEXT, __cstring): 4
Section (__DATA, __bss): 4
Section (__LD, __compact_unwind): 64
Section (__TEXT, __eh_frame): 104
total 288
total 292
3、输出 Mach-O 分段信息,包含地址和偏移:size -m [file] -l
$size -m SimpleSection.o -l
Segment : 292 (vmaddr 0x0 fileoff 712)
Section (__TEXT, __text): 104 (addr 0x0 offset 712)
Section (__DATA, __data): 8 (addr 0x68 offset 816)
Section (__TEXT, __cstring): 4 (addr 0x70 offset 824)
Section (__DATA, __bss): 4 (addr 0x120 offset 0)
Section (__LD, __compact_unwind): 64 (addr 0x78 offset 832)
Section (__TEXT, __eh_frame): 104 (addr 0xb8 offset 896)
total 288
total 292
4、输出 Mach-O 分段信息,十六进制格式:size -m [file] -x
$size -m SimpleSection.o -x
Segment : 0x124
Section (__TEXT, __text): 0x68
Section (__DATA, __data): 0x8
Section (__TEXT, __cstring): 0x4
Section (__DATA, __bss): 0x4
Section (__LD, __compact_unwind): 0x40
Section (__TEXT, __eh_frame): 0x68
total 0x120
total 0x124
ld
在终端中执行:man ld
,可以查看 链接器ld 的用法,截取前面一段内容如下所示
NAME
ld -- linker
SYNOPSIS
ld files... [options] [-o outputfile]
DESCRIPTION
The ld command combines several object files and libraries, resolves references, and pro-
duces an ouput file. ld can produce a final linked image (executable, dylib, or bundle), or
with the -r option, produce another object file. If the -o option is not used, the output
file produced is named "a.out".
- 名称:链接器
- 概要(用法):
ld files... [options] [-o outputfile]
-
files...
:表示可以链接多个文件 -
[options]
:表示一些可选配置 -
[-o outputfile]
:表示可以设置输出文件
-
- 描述:ld命令组合多个目标文件和库,解析引用并生成一个输出文件(可执行文件)。ld可以生成最终的镜像(可执行文件、动态库或包),也可使用 -r 选项生成另一个目标文件。如果没有使用 -o 指定输出文件,则会默认生成输出文件 a.out。
看到这么多内容,基本上可以对 链接器ld 有一个大概的印象了,具体的用法可以往后查阅 options 的含义。 -
-static
:生成不使用 dyld的 mach-o文件,仅用于构建内核。
网友评论