美文网首页
00--命令使用总结

00--命令使用总结

作者: 修_远 | 来源:发表于2020-09-28 21:18 被阅读0次

[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.ihello.shello.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文件,仅用于构建内核。

相关文章

  • 00--命令使用总结

    [TOC] gcc 1、预编译命令:gcc -E 表示只进行预编译,将源文件预编译成 .i 或 .ii 文件 2、...

  • Git常用命令

    总结日常使用的命令,持续更新~

  • Vim 常用快捷键

    一、前言 总结一下 Vim 高频率使用命令,在 cmd(命令行)中,使用 Vim 编辑文件命令是vim [file...

  • git常用命令

    对git常用命令做个总结,以便以后使用:

  • Redis 集群手动故障切换

    总结写在前面: 使用cluster failover命令进行手动主从切换 cluster failover命令的参...

  • OpenSSL常用命令总结

    本文只总结常用命令,以备快速查阅和使用,详细的命令使用及其理解可以参见文章:密码学基础(四):openssl命令详...

  • artisan 命令使用总结

    artisan 命令使用总结 artisan 命令使用过程的一些记录! ==数据迁移== 之前一直对数据迁移很感兴...

  • Linux学习总结

    Linux学习总结 一、Linux常用命令 1.1 命令格式 命令名 [选项] [参数1] [参数2] 使用bas...

  • GIT命令,这几个就够了!

    工作中使用Git很久了,总结下性价比比较高的几个命令,不是命令手册,也不卖弄技术,只为熟练的使用。 初级命令 gi...

  • 设计模式:第六篇--命令模式

    命令模式模型 案例:家居遥控器撤销命令宏命令 总结: 命令模式模型 命令模式:将“请求”封装成对象,以便使用不同的...

网友评论

      本文标题:00--命令使用总结

      本文链接:https://www.haomeiwen.com/subject/qcmjuktx.html