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
- fedora 命令
- Fedora 命令
- Fedora yum命令详解
- fedora Yum命令
- fedora yum命令使用指南
- fedora: minicom命令找不到
- fedora Yum命令
- Fedora yum命令详解
- Fedora yum命令详解
- Fedora快捷键命令收集
- Fedora命令大全
- Fedora命令大全
- fedora 的 firewall 命令
- fedora下命令yum
- Fedora获取权限命令
- fedora dnf 命令
- Fedora 中的 Fedora Yum命令详解
- Fedora yum之基本命令
- convert sorted array to binary search tree
- Python系列视频教程: Django【13讲】第13讲 表单使用
- 【POJ】【P1004】【Financial Management】【题解】【水题】
- 从零开始学习OpenGL ES之四 – 光效
- sh_脚本基础、语法学习
- fedora 命令
- cocos2d-x 五子棋
- poj3984 迷宫问题
- 图的相关概念
- Cracking the coding interview--Q3.1
- 酷狗歌手写真图片
- 深搜 拓扑排序
- Ubuntu 13.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答
- 利用协同过滤算法的皮尔逊系数:计算歌曲相似度