反汇编Linux
linux gcc编译c文件头文件
linux gcc编译c文件头文件,使用GCC编译器编译C语言
凶猪下山
转载
关注
0点赞·1047人阅读
GCC编译C源代码有四个步骤:预处理—->编译—->汇编—->链接。
可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序的裤晌过程。
下面将通过对一个程序的编译来演示整个过程。
#include
int main()
{
printf("happy new year!\n");
return 0;
}
1:预处理:编译前纯李器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。
预处理 命令:gcc -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i
2:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用gcc的参数-S来参看。
编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s, 它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了一条低级机器语言指令。
编译命令:gcc -S hello.i -o hello.s
作用:将预处理输出文件hello.i汇编成hello.s文件
3:汇编:把编译阶段生成的.s 文件转换为二进制目标代码。可用gcc的参数-c来参看。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式, 并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言。
汇编 命令:gcc -c hello.s -o hello.o
作用:作用:将汇编输出文件hello.s编译输出hello.o文件
4:链接:把obj文件链接为可执行的文件:链接器(ld)负责.o文件的并入。结果就是hello文件,它是一个课执行的目标文件,可以加载到存储器后由系统调用。
链接命令:gcc hello.o -o hello
一步操作的话是: (-o必须在hello之前 )
$gcc hello.c -o hello
$./hello或者:(会默认生成a.out文件)
$gcc hello.c
$./慧迟a.out
⑵ Linux下有没有类似于OD的反汇编工具
可以试ldasm,不过一般在linux系统,命令行下用gdb
图形界面的可以试试ddd,其实也是封装的gdb
⑶ linux反汇编寄存器参数
Linux反汇编寄存器判庆参数包括:
1. EAX:通用寄存器,用于存储操作数和返回值。
2. EBX:迹侍通用姿冲吵寄存器,用于存储数据。
3. ECX:通用寄存器,用于计数或循环操作。
4. EDX:通用寄存器,用于处理I/O端口。
5. ESI:源指针寄存器,用于复制数据。
6. EDI:目的指针寄存器,用于复制数据。
7. EBP:帧指针寄存器,用于保留函数调用栈的地址。
8. ESP:栈指针寄存器,由CPU自动维护其内容以衡量栈的大小。
⑷ linux 64位 程序错误 如何反汇编找到general protection ip:7fcc6eece1a9
7f是windows api函数,请检查参数传入是否有误,bx等非易失寄存器是否保护
⑸ linux下的ELF可执行文件反汇编去掉验证代码
linux下可执行文件不是以后缀命名的,后缀只是让操作人员自己知道这是什么类型的文件,对本件本身没有任何意义。
举栗:
test.sh #是以shell写的脚本
test.py #是以python写的脚本
文件可执行是权限问题:x权限表示可执行
⑹ linux反汇编mbr用什么工具
linux上很容易反汇编的啊。用nasm就可以的。
1、首先读取穗猜mbr
sudo dd if=/dev/sda of=mbr.bin count=1
dd是linux的命令,需要root权限的,if是输入方法 ,在linux上所有的设备都是文件 ,猜指型mbr在第一块硬盘上,所以if=dev/sda。of=mbr.bin
2、下载nasm
sudo apt-get install nasm
下载安装nasm
3、反汇编mbr
ndisasm mbr.bin | less
或者
ndisasm mbr.bin >mbr.asm
逗闹vim mbr.asm
⑺ LINUX下有一般用什么反汇编工具
答:linux上很容易反汇编的埃用nasm就可以的。 1、首先读取mbr sudo dd if=/dev/sda of=mbr.bin count=1 dd是linux的命令,需要root权限的,if是输入方法 ,在linux上所有的设备都是文件 ,mbr在第一块硬盘上,所以if=dev/sda。of=mbr.bin
⑻ linux查看c++程序某个函数的反汇编会显示函数名吗
这个问题很复杂。这得看你的二进制程序是否包含这些信息。这得看 编译选项 有没有包含 -s 。-s选项会剔除不需要的符号名。
正式二进制发布的软件是可以没有这些信息的。对于静态链接后 函数名在c/c++ 语言执行的过程中是不需要的,它是通过内存地址 去访问 内存,数据和代码。函数名用于 编译过程 和链接过程。对于动太链接在程序执行过程由ld.so 通过变量名去 动态的链接到某些库的指定函数。动态链接的符号名不可剔除。
说到底就是二进制程序如果包含变量名,就会显示。
实例
main.c:
intaaa=10;
intmyfunc(){
return5;
}
intmain(){
intbbb=20;
aaa=20;
bbb=myfunc();
return0;
}
gcc-nostdlibmain.c-omain_with_symbols
gcc-nostdlibmain.c-omain_without_symbols
分别产生包含符号名 和不包含符号名的 可执行文件。
!122~/src/c_cpp%objmp-dmain_with_symbols|grepmyfunc
000000000040017c<myfunc>:
4001a5:e8d2ffffffcallq40017c<myfunc>
!123~/src/c_cpp%objmp-dmain_without_symbols|grepmyfunc
!124~/src/c_cpp1%
很明显使用 -s 选项后 很多符号信息丢失,反汇编中也不包含相关符号名。
⑼ linux中 gcc 下ld 链接成什么格式的目标文件,有生成的哪些文件可以反汇编,反汇编的工具有哪些
elf可执行文件
生成的目标文件(也即.o文件)和elf文件都可以反汇编
反汇编工具就是objmp命令,加个-S的选项就可以了。例如:
objmp -S hello > hello.mp
⑽ 如何在linux下把.so文件反汇编
和反汇编其他程序一样,用 objmp 或其他你喜欢的反汇编工具都可以的