fedora 命令

来源:互联网 发布:淘宝购物生成器 编辑:程序博客网 时间:2024/05/18 21:05

file:查看文件的类型

nm:列举目标文件中的符号

strings:提取文件中的字符串内容,该工具不会

安装gcc :yum install gcc受到文件格式的影响。

安装g++:yum install gcc-c++

vi 复制命令:yy:复制当前行

nyy:复制从该行开始的n个行

SimpleSection.c内容:

      1 #include <stdio.h>      2       3 int global_init_var = 84;      4 int global_uninit_var;      5       6 void func1(int i)      7 {      8      printf("%d\n", i);      9 }     10      11 int main()     12 {     13     static int static_var = 85;     14     static int static_var2;     15      16     int a = 1;     17     int b;     18     func1(static_var + static_var2 + a + b);     19      20     return 0;     21 }

gcc -c SimpleSection.c: -c表示只编译不链接

objdump -h SimpleSection.o: 查看目标文件的内容

[root@localhost xlf]# objdump -h SimpleSection.o

SimpleSection.o:     file format elf32-i386Sections:Idx Name          Size      VMA       LMA       File off  Algn  0 .text         00000054  00000000  00000000  00000034  2**2                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE  1 .data         00000008  00000000  00000000  00000088  2**2                  CONTENTS, ALLOC, LOAD, DATA  2 .bss          00000004  00000000  00000000  00000090  2**2                  ALLOC  3 .rodata       00000004  00000000  00000000  00000090  2**0                  CONTENTS, ALLOC, LOAD, READONLY, DATA  4 .comment      0000002d  00000000  00000000  00000094  2**0                  CONTENTS, READONLY  5 .note.GNU-stack 00000000  00000000  00000000  000000c1  2**0                  CONTENTS, READONLY  6 .eh_frame     00000058  00000000  00000000  000000c4  2**2                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

-h 将ELF文件的各个段的基本信息打印出来

-x 可以打印更多的内容

size SimpleSection.o: 查看ELF文件的代码段,数据段和BBS段的长度(dec表示3个段的长度的和的十进制,hex表示十六进制)

[root@localhost xlf]# size SimpleSection.o
   text       data        bss        dec        hex    filename
    176          8          4        188         bc    SimpleSection.o

分析代码段(.text):
objdump -s -d SimpleSection,o

-s将所有段的内容以十六进制的方式打印出来,-d 将所有包含指令的段反汇编。下面提取代码段:

Contents of section .text: 0000 5589e583 ec188b45 08894424 04c70424  U......E..D$...$ 0010 00000000 e8fcffff ffc9c355 89e583e4  ...........U.... 0020 f083ec20 c744241c 01000000 8b150400  ... .D$......... 0030 0000a100 00000001 c28b4424 1c01c28b  ..........D$.... 0040 44241801 d0890424 e8fcffff ffb80000  D$.....$........ 0050 0000c9c3                             ....            Contents of section .data: 0000 54000000 55000000                    T...U...        Contents of section .rodata: 0000 25640a00                             %d..            Contents of section .comment: 0000 00474343 3a202847 4e552920 342e372e  .GCC: (GNU) 4.7. 0010 32203230 31323039 32312028 52656420  2 20120921 (Red  0020 48617420 342e372e 322d3229 00        Hat 4.7.2-2).   Contents of section .eh_frame: 0000 14000000 00000000 017a5200 017c0801  .........zR..|.. 0010 1b0c0404 88010000 1c000000 1c000000  ................ 0020 00000000 1b000000 00410e08 8502420d  .........A....B. 0030 0557c50c 04040000 1c000000 3c000000  .W..........<... 0040 1b000000 39000000 00410e08 8502420d  ....9....A....B. 0050 0575c50c 04040000                    .u......        Disassembly of section .text:00000000 <func1>:   0:55                   push   %ebp   1:89 e5                mov    %esp,%ebp   3:83 ec 18             sub    $0x18,%esp   6:8b 45 08             mov    0x8(%ebp),%eax   9:89 44 24 04          mov    %eax,0x4(%esp)   d:c7 04 24 00 00 00 00 movl   $0x0,(%esp)10: R_386_32.rodata  14:e8 fc ff ff ff       call   15 <func1+0x15>15: R_386_PC32printf  19:c9                   leave    1a:c3                   ret    0000001b <main>:  1b:55                   push   %ebp  1c:89 e5                mov    %esp,%ebp  1e:83 e4 f0             and    $0xfffffff0,%esp  21:83 ec 20             sub    $0x20,%esp  24:c7 44 24 1c 01 00 00 movl   $0x1,0x1c(%esp)  2b:00   2c:8b 15 04 00 00 00    mov    0x4,%edx2e: R_386_32.data  32:a1 00 00 00 00       mov    0x0,%eax33: R_386_32.bss  37:01 c2                add    %eax,%edx  39:8b 44 24 1c          mov    0x1c(%esp),%eax  3d:01 c2                add    %eax,%edx  3f:8b 44 24 18          mov    0x18(%esp),%eax  43:01 d0                add    %edx,%eax  45:89 04 24             mov    %eax,(%esp)  48:e8 fc ff ff ff       call   49 <main+0x2e>49: R_386_PC32func1  4d:b8 00 00 00 00       mov    $0x0,%eax  52:c9                   leave    53:c3                   ret   

十六进制中右边是.text的ASC吗形式。

而对于反汇编的命令,开始的0x55就是func1()函数的第一条“push %ebp”指令,最后一个0xc3正是main函数的最后一条指令“ret”

数据段(.data)和只读数据段(.rodata):

.data段保存的是已经初始化了的全局静态变量和局部静态变量。代码中有,gobal_init_var, static_var;每个变量四个自己,刚好8个字节,所以.data的大小为8字节。

printf中用到了个字符串常量“%d\n”,这是只读数据,放到了".rodata",这个段刚好4个字节,就是这几个字符常量的ASC吗字节序,最后以\0结尾。

.rodata存放的是只读数据,一般是程序里面的只读变量(如const修饰的常量)和字符串常量。有时候编译器会把字符串常量放到.data段,因为编译器的不同。

BSS段:

存放的是未初始化的全局变量和局部静态变量。如global_uninit_var和static_var2,其实是.bss段为它们欲留了空间。但是该段只有4自己,通过符号表可以看到,只有static_var2被存放在了.bss段,而global_uninit_init没有被存放到任何段,只有一个未定义的COMMON符号。这是跟不同的编译器实现有关,有些编译器会将全局的未初始化变量存放在.bss段,有些则不存放,只是欲留一个未定义的全局变量符号,等到最终链接成可执行文件的时候再在.bss段分配空间。

编译段元内部可见的静态变了,例static global_uninit_var是存放在.bss段的。


c++编译器会将在extern “C”的大括号内部的代码当作C语言代码处理。

对于C/C++,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。


fedora不自带静态链接库libc.a,需要自行安装:

yum install glibc-static


0 0
原创粉丝点击