命令总结-gcc gdb git

li# gcc命令总结

一步到位编译:gcc hello.c -o hello

预处理 -E (.i) 编译 -S (.s) 汇编-c (.o) 连接-o

预处理

gcc -E hello.c -o hello.i -E:仅执行编译预处理

-o:将结果输出并指定输出文件的文件名

编译为汇编代码

gcc -S hello.c(.i) -o hello.s -S:将C代码转换为汇编代码

汇编:

gcc -c hello.c -o hello.o -c:仅执行编译操作,不进行连接操作

连接:

gcc hello.o -o hello


-o:将结果输出并指定输出文件的文件名

-O0、-O1、-O2、-O3:编译优化选项的四个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高

-g:只是编译器,在编译的时候,产生调试信息

反汇编:

gcc hello.c -g -o hello

Objdump -S -dx hello >hello.s

-S:显示汇编代码的时候同时显示原来的C语言源代码

Unicode 与UTF-8

unicode才是编码,而utf-8是存储方式

unicode编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

uft-8编码得到的字节数不确定,可能是1个字节,也可能是3个字节。但utf-8最大的好处是和ASCII码兼容,存储英文字母都是一个字节,因此现在被广泛应用。

对于 UTF-8 编码中的任意字节B,如果B的第一位为0,则B独立的表示一个字符(ASCII 码);
如果B的第一位为1,第二位为0,则B为一个多字节字符中的一个字节(非 ASCII 字符);
如果B的前两位为1,第三位为0,则B为两个字节表示的字符中的第一个字节;
如果B的前三位为1,第四位为0,则B为三个字节表示的字符中的第一个字节;
如果B的前四位为1,第五位为0,则B为四个字节表示的字符中的第一个字节;
因此,对 UTF-8 编码中的任意字节,根据第一位,可判断是否为 ASCII 字符;根据前二位,可判断该字节是否为一个字符编码的第一个字节;根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示;根据前五位(如果前四位为1),可判断编码是否有错误或数据传输过程中是否有错误。

GDB
可以先用readelf –a bomb 看一下执行文件的大致结构。第一条指令位置不是main
(gdb)l (ist) (gdb) b main 断点 (gdb) r 运行 c继续
(gdb) disassemble main /m c和asm一起排列 /r 看16进制代码
(gdb) x/15i main 用 x/i 可以查看指令
(gdb) x/15 地址 用 x/ 可以查看数据 s字符串 x十六进制
(gdb) display/10i main 命令自动显示当前正要执行汇编指令
(gdb) ni; 单执行下一条机器指令 n单步执行一条C语句 (gdb) si: 单步执行入一条机器指令 s单步执行一条C语句
(gdb) print $eax $RIP 反人类!!
(gdb) info reg info proc all看本进程的所有信息
(gdb) layout prev | next | <layout_name> 改变布局 src/asm/split/regs
(gdb) set disassembly-flavor intel 改成Intel格式

ELF文件分析

readelf看帮助

readelf -h 读取分析ELF文件头

readelf -s 符号表(分析符号与动态符号)

​ -x 看字节

​ -p看字符串

readelf -a 看所有信息

readelf <option(s)> elf-file(s)

-a –all 等同于同时使用:-h -l -S -s -r -d -V -A -I
-h --file-header 显示ELF文件头
-l --program-headers 显示程序头
-S --section-headers 显示节头
-t --section-details 显示节详细信息
-s –syms 显示符号表(symbol table)
-r –relocs 显示重定位信息
-d –dynamic 显示动态节(dynamic section)
-x --hex-dump=<number|name>
以字节形式显示输出<number|name>指定节的内容
-p --string-dump=<number|name>
以字符串形式显示输出<number|name>指定节的内容
-R --relocated-dump=<number|name>
以重定位后的字节形式显示输出<number|name>指定节内容

发布了7 篇原创文章 · 获赞 3 · 访问量 469

猜你喜欢

转载自blog.csdn.net/qq_39600733/article/details/103938038
今日推荐