gnu的binutils以及msvc的utils使用

gnu的binutils的使用

object file大致就是executable(a.out), reallocable(.o), dynamic library(.so)几种,以ELF格式为例,一个ELF格式分为很多section,其中以点开头的字符串命名的section都是约定俗成的一些 特殊section。

 

binutils中的readelf可以比较方便地分析一个ELF文件,-a参数列出所有能查询到的 结果,即--file-header, --program-headers, --sections, --symbols, --relocs, --dynamic, --notes, --version-info几个参数的组合;其中的--sections可以列出该ELF中所有的section,别的除了前三项,基本也都是对应一些 特殊section。

 

注意ELF的section和进程内存中的segment是两个概念:一个segment可能包含多个section(和section之外的内容),而一个section可能映射到多个segment中。

ELF文件使用program header来指导exec()该ELF镜像的过程,而其中每个LOAD类型的`--program-headers`则直接指导如何生成一个segment。

 

我们经常谈论的符号表,涉及到两个特殊section,即.symtab和.dynsym,也就是对应readelf的--dynamic选项(二者都会输 出);binutils中的strip命令可以把.symtab干掉;而.so中基本上就是提供.dynsym供人调用。

除了readelf,objdump(它的特长是可以列出汇编代码)也可以,以及binutils中的nm更可以(专门干这个的);nm默认输出.symtab,nm -D输出.dynsym,不过个人感觉nm的三种输出格式都没有readelf的直观。

《C++的lib不是跨编译器的》中,我使用MingW移植的objdump来显示了PE文件的符号表。

 

而readelf的--dynamic则会列出.dynamic区段的信息,相当于ldd的raw结果。

 

msvc的utils使用

PE文件和ELF文件是存在亲缘关系的,他们都是从早期的COFF文件格式发展而来。

 

从dll生成def类型的lib:

dumpbin /exports C:\yourpath\yourlib.dll > mylib.def

vim mylib.def 只保留函数名,然后在文件头加一行EXPORTS

lib /def:C:\mypath\mylib.def /OUT:C:\mypath\mylib.lib

 

dumpbin /headers xxx.dll

在输出中最靠前的File Header部分,可以得知是x86还是x64的PE文件。

你可能感兴趣的:(c,MinGW,binutils)