未使用调试信息生成二进制文件_C语言编写ELF文件解析器(1)

在Linux下,gcc编译出来的可执行文件是elf格式的二进制文件。那么肯定要elf文件进行解析才能正确的得到进程可执行数据的位置。

Linux下的c语言或c++编程涉及底层开发的内容。首先,segment是section的集合,一个segment可以映射到section。ELF文件解析是机器语言。而ARM的可执行文件格式是ELF文件解析格式。

验证自己的readelf是否正确,使用之前讨论过的readelf命令即可。详细的readelf的命令可以通过man readelf命令查看命令手册。

首先我先读了一下别人的源码(卑微)。结合一下自己需要达成的目标功能,大致心得如下:

首先需要完成的功能:

-syms:显示文件的符号表入口。类似于nm -s提供的信息 。objdump给出的输出结果为:

fc2b25cc93240fd9387e369d73db8792.png

-reloc: 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。

1a33794c8358c11483da0f3a39b8d97c.png

-section:仅仅显示指定名称为name的section的信息

8c41739614aa5887e72bf4f8b70fb615.png

-section-headers:显示目标文件各个section的头部摘要信息。

051e85b26c5402e74614bc793bb82e95.png

-file-headers:显示objfile中每个文件的整体头部摘要信息。

954d5a8b18a85e1a33b82315130c0201.png

-all-headers:显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。

27ab4d18d89f0aebc3525d98b76ec769.png

a53feaf169197c34e34212b1690cb87e.png

-full-contents:显示指定section的完整内容。默认所有的非空section都会被显示。

d1496d42c083f469220804ce64bfc1b7.png

-dwarfs:显示文件中包含有DWARF调试信息格式的段.

11487f21b6538886e0504c87bffd416b.png

-g:显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。

0db75de3725377c4a5d9f6a5eebb5129.png

熟悉了一下Linux下命令行参数:

421f59b5b5f21c488a64e4559d0d78ed.png

当然我们实际要达到的效果和readelf命令还是有些区别的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC 6.0常见安装错误 VC调试常见错误 程序设计到多线程,VC++6.0默认设置可作以下修改: project->settings->C/C++->Category中选Code Generation->Use Run-time Library选Debug MultiThreaded或MultiThreaded 在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex 下面介绍解决的方法: 1. Windows子系统设置错误, 提示: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: [Project] --> [Settings] --> 选择"Link"属性页, 在Project Options中将/subsystem:console改成/subsystem:windows 2. Console子系统设置错误, 提示: LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 控制台项目要使用Console子系统, 而不是Windows, 设置: [Project] --> [Settings] --> 选择"Link"属性页, 在Project Options中将/subsystem:windows改成/subsystem:console 3. 程序入口设置错误, 提示: msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: [Project] --> [Settings] --> 选择"C/C++"属性页, 在Category中选择Output, 再在Entry-point symbol中填入wWinMainCRTStartup, 即可 4. 线程运行时库设置错误, 提示:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值