# GNU Binutils 翻译
- Version 2.37
<font style="background:yellow">
- 维基百科:GNU_Binutils (opens new window)
- utilities,n.实用程序
- Bin+util+s
# 目录
- 目录
- 1.ar ⭐️「静态库」制作
- 2.ld ✔️
- 3.nm
- 4.objcopy
- 5.objdump ⭐️
- 6.ranlib ✔️
- 07.size⭐️✔️
- 08.strings
- 09.strip
- 10.c++filt
- 11.addr2line
- 12.windmc「Windows」
- 13.windres「Windows」
- 14.dlltool
- 15.readelf ⭐️
- 16.elfedit ✔️
- 17.公共选项Common Options✔️
- 18.选择目标系统Selecting the Target System✔️
- 19.debuginfod「不是命令」
- 20.报告错误
- Appendix「附录」 A GNU Free Documentation License
- Binutils Index
- 参考资料
[TOC]
# 1.ar
⭐️「静态库」制作
ar [-]p[mod] [--plugin name] [--target bfdname] [--output dirname] [--record-libdeps libdeps] [relpos] [count] archive [member...]
ar -M [ <mri-script ]
2
3
GNU ar
程序创建、修改和提取档案archives(档案)。An archive(归档文件是)一个单独的文件,其中包含一组其他文件,其结构可以检索原始的单个文件(称为归档文件的成员)。原始文件的内容、模式(权限)、时间戳、所有者和组保存在存档中,可以在提取时恢复。
gnu ar可以维护其成员姓名长度不限的档案;但是,根据ar在系统上的配置方式,可能会对成员名称长度施加限制,以与其他工具维护的存档格式兼容。如果存在,限制通常为15个字符(与a.out相关的典型格式)或16个字符(与coff相关的典型格式)。
ar被认为是一种二进制实用程序,因为这类档案最常用作保存常用子程序的库。由于库通常依赖于其他库,所以在指定**--record-libdeps
**选项时,ar也可以记录库的依赖关系。
当您指定修饰符“s”时,ar将为存档中可重定位对象模块中定义的符号创建索引。创建后,每当ar对其内容进行更改时(保存为“q”更新操作),该索引都会在存档中更新。具有这样一个索引的归档文件可以加速与库的链接,并允许库中的例程相互调用,而不考虑它们在归档文件中的位置。
您可以使用“nm-s”或“nm-print armap”列出此索引表。如果归档文件缺少表,则可以使用另一种形式的ar called ranlib来添加表。
gnu ar可以选择性地创建精简归档,其中包含一个符号索引和对归档的成员文件的原始副本的引用。这对于在本地生成树中构建库非常有用,在本地生成树中,可重新定位的对象将保持可用,复制每个对象的内容只会浪费时间和空间。
归档文件可以是精简thin的,也可以是普通的normal。这两种情况不可能同时发生。一旦创建了存档文件,如果不先将其删除,然后在其位置创建新的存档文件,则无法更改其格式。
精简归档文件也会被展平,因此将一个精简归档文件添加到另一个精简归档文件不会像普通归档文件那样嵌套它。而是将第一个归档文件的元素单独添加到第二个归档文件中 。
存档元素的路径是相对于==存档本身==存储的。
gnu ar设计为与两个不同的设施兼容。您可以使用命令行选项控制其活动,比如Unix系统上的各种ar;或者,如果指定单命令行选项**-M**,则可以使用通过标准输入提供的脚本来控制它,比如**MRI “librarian”**程序
# 1.1.在命令行上控制ar
ar [-X32_64] [-]p[mod] [--plugin name] [--target bfdname] [--output dirname] [--recordlibdeps libdeps] [relpos] [count] archive [member...]
在Unix样式中使用ar时,ar坚持至少要执行两个参数:一个指定操作的键字母(keyletter)(可选地伴随其他指定修饰符的键字母),以及要执行操作的存档名称
大多数操作还可以接受进一步的成员参数,指定要操作的特定文件。
gnu ar允许您在第一个命令行参数中以任意顺序混合操作代码p和修改器标志mod。
如果愿意,可以用破折号开始第一个命令行参数。
==p键字母==指定要执行的操作;可以是以下任意一项,但==必须仅指定其中一项==:
d
- 从存档中删除模块。指定要作为成员删除的模块的名称;如果未指定要删除的文件,则存档将保持不变。如果指定“v”修饰符,ar会在删除模块时列出每个模块。
m
使用此操作可以移动存档中的成员。如果在多个成员中定义了符号,则存档中成员的顺序可能会影响使用库链接程序的方式。
如果m没有使用修饰符,则在成员参数中命名的所有成员都将移动到存档的末尾;可以使用“a”、“b”或“i”修饰符将它们移动到指定的位置。
p
- 将指定的存档成员打印到标准输出文件。如果指定了“v”修饰符,请在将其内容复制到标准输出之前显示成员名称。
- 如果未指定成员参数,则会打印存档中的所有文件
q
- 快速追加;历史上,添加文件成员。
- 到存档结束时,无需检查是否有替换。修饰符“a”、“b”和“i”不影响此操作;新成员总是放在档案的末尾。
- 修饰符“v”使ar在附加文件时列出每个文件。
- 由于此操作的重点是速度,ar的实现可以选择不更新存档的符号表(如果存在)。然而,有太多不同的系统假设符号表总是最新的,因此gnu ar即使在快速附加的情况下也会重建表。
- 注意——gnu ar将命令“qs”视为“r”的同义词——替换存档中已有的文件,并在末尾追加新文件
r
- 插入文件成员。存档(替换)。此操作与“q”的不同之处在于,如果以前存在的成员的名称与要添加的成员的名称匹配,则会将其删除
- 如果成员中指定的某个文件。如果不存在,ar将显示一条错误消息,并且不会干扰与该名称匹配的存档的任何现有成员。
- 默认情况下,会在文件末尾添加新成员;但您可以使用其中一个修饰语“a”、“b”或“i”来请求相对于某个现有成员的位置。
- 与此操作一起使用的修饰符“v”会为插入的每个文件引出一行输出,以及字母“a”或“r”中的一个,以指示文件是追加的(没有删除旧成员)还是替换的。
s
向存档中添加索引,如果已经存在,则进行更新。注意:==这个命令是一个例外,因为它可以用作命令或修饰语,所以只能有一个命令字母==。无论哪种情况,它都会做同样的事情。
t
显示一个表格,列出归档文件的内容,或成员中列出的文件的内容。这些都存在于档案中。通常只显示成员名称,但如果指定了修饰符“O”,则也会显示成员的相应偏移量。最后,为了查看模式(权限)、时间戳、所有者、组和大小,应该包含“v”修饰符。如果未指定成员,则会列出存档中的所有文件。如果存档文件(如“b.a”)中有多个同名文件(如“fie”),则“ar t b.a fie”仅列出第一个实例;要查看所有这些,您必须在我们的示例中要求完整的列表“ar t b.a”。
x
从存档中提取成员(命名成员)。您可以在这个操作中使用“v”修饰符,请求ar在提取每个名称时列出它们。如果未指定成员,则会提取存档中的所有文件。无法从精简档案中提取文件,并且从使用P创建的档案中提取文件有限制:路径不能是绝对路径,不能包含。。,路径中的任何子目录都必须存在。如果希望避免这些限制,则使用--output选项指定输出目录
许多==修饰符(mod)==可以紧跟在p键字母之后,以指定操作行为的变化:
a
- 在存档的现有成员之后添加新文件。如果使用修饰符“a”,则现有存档成员的名称必须作为relpos参数出现在存档规范之前
b
- 在存档的现有成员之后添加新文件。如果使用修饰符“a”,则现有存档成员的名称必须作为relpos参数出现在存档规范之前
c
- 创建归档文件。当您请求更新时,如果指定的存档不存在,则始终会创建该存档。但是,除非您事先指定要使用此修饰符创建警告,否则会发出警告
D
- 在确定性模式下运行。添加文件和存档索引时,UID、GID和时间戳使用零,所有文件使用一致的文件模式。使用此选项时,如果ar与相同的选项和相同的输入文件一起使用,则无论输入文件的所有者、组、文件模式或修改时间如何,多次运行都将创建相同的输出文件。如果binutils配置了--enable deterministic archives,那么默认情况下,此模式处于启用状态。可以使用下面的“U”修饰符禁用它。
# 1.2.用脚本控制ar
ar -M [ <script ]
# 2.ld
✔️
gnu链接器ld现在在单独的手册(separate manual)中描述。请参阅使用中的“概述”一节 LD:GNU链接器。
# 3.nm
nm [-A|-o|--print-file-name]
[-a|--debug-syms]
[-B|--format=bsd]
[-C|--demangle[=style]]
[-D|--dynamic]
[-fformat|--format=format]
[-g|--extern-only]
[-h|--help]
[--ifunc-chars=CHARS]
[-j|--format=just-symbols]
[-l|--line-numbers] [--inlines]
[-n|-v|--numeric-sort]
[-P|--portability]
[-p|--no-sort]
[-r|--reverse-sort]
[-S|--print-size]
[-s|--print-armap]
[-t radix|--radix=radix]
[-u|--undefined-only]
[-V|--version]
[-X 32_64]
[--defined-only]
[--no-demangle]
[--no-recurse-limit|--recurse-limit]]
[--plugin name]
[--size-sort]
[--special-syms]
[--synthetic]
[--target=bfdname]
[--with-symbol-versions]
[--without-symbol-versions]
[objfile...]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
GNU nm列出了目标文件objfile..
.中的符号,如果没有目标文件被列为参数,nm
假定文件为a.out
。
对于每个符号,nm 显示:
- 符号值(The symbol value),以选项选择的基数(见下文),或十六进制默认。
- 符号类型(The symbol type)。至少使用了以下类型; 其他的也取决于目标文件格式。 ==如果是小写,符号通常是本地的==; 如果大写,则符号是全局的(外部的)。 但是,对于特殊的全局符号(u、v 和 w),会显示一些小写符号。
A
- 符号的值是绝对值,不会因进一步链接而改变。
B
b
- 该符号位于 BSS 数据段(BSS data section)。 此部分通常包含初始化为0或未初始化的数据,尽管确切的行为取决于系统。
C
- 符号很常见(The symbol is common)。 公共符号(Common symbols)是未初始化的数据。 链接时,可能会出现多个具有相同名称的常用符号。 如果在任何地方定义了符号,则公共符号将被视为未定义的引用。 有关常用符号的更多详细信息,请参阅 GNU linker的“链接器选项(Linker options)”部分中对 –warn-common 的讨论。 当符号位于小公域的特殊部分时,使用小写 c 字符。
D
d
- 该符号位于已初始化的数据段(initialized data section)。
G
g
- 该符号位于小对象(small objects)的初始化数据部分中。 某些目标文件格式允许更有效地访问小数据对象,例如全局 int 变量而不是大型全局数组。
i
- 对于 PE 格式文件,这表示该符号位于特定于 DLLs 实现的部分中
- 对于 ELF 格式文件,这表明该符号是一个间接函数。 这是标准 ELF 符号类型集的 GNU 扩展。 它表示一个符号,如果被重定位引用,它不会计算其地址,而是必须在运行时调用。 然后运行时执行将返回要在重定位中使用的值。
- 注意:GNU 间接符号的实际符号显示由 --ifunc-chars 命令行选项控制。 如果已提供此选项,则字符串中的第一个字符将用于全局间接函数符号。 如果字符串包含第二个字符,则该字符将用于局部间接函数符号。
# 4.objcopy
objcopy [-F bfdname|--target=bfdname]
[-I bfdname|--input-target=bfdname]
[-O bfdname|--output-target=bfdname]
[-B bfdarch|--binary-architecture=bfdarch]
[-S|--strip-all]
[-g|--strip-debug]
[--strip-unneeded]
[-K symbolname|--keep-symbol=symbolname]
[--keep-file-symbols]
[--keep-section-symbols]
[-N symbolname|--strip-symbol=symbolname]
[--strip-unneeded-symbol=symbolname]
[-G symbolname|--keep-global-symbol=symbolname]
[--localize-hidden]
[-L symbolname|--localize-symbol=symbolname]
[--globalize-symbol=symbolname]
[--globalize-symbols=filename]
[-W symbolname|--weaken-symbol=symbolname]
[-w|--wildcard]
[-x|--discard-all]
[-X|--discard-locals]
[-b byte|--byte=byte]
[-i [breadth]|--interleave[=breadth]]
[--interleave-width=width]
[-j sectionpattern|--only-section=sectionpattern]
[-R sectionpattern|--remove-section=sectionpattern]
[--keep-section=sectionpattern]
[--remove-relocations=sectionpattern]
[-p|--preserve-dates]
[-D|--enable-deterministic-archives]
[-U|--disable-deterministic-archives]
[--debugging]
[--gap-fill=val]
[--pad-to=address]
[--set-start=val]
[--adjust-start=incr]
[--change-addresses=incr]
[--change-section-address sectionpattern{=,+,-}val]
[--change-section-lma sectionpattern{=,+,-}val]
[--change-section-vma sectionpattern{=,+,-}val]
[--change-warnings] [--no-change-warnings]
[--set-section-flags sectionpattern=flags]
[--set-section-alignment sectionpattern=align]
[--add-section sectionname=filename]
[--dump-section sectionname=filename]
[--update-section sectionname=filename]
[--rename-section oldname=newname[,flags]]
[--long-section-names {enable,disable,keep}]
[--change-leading-char] [--remove-leading-char]
[--reverse-bytes=num]
[--srec-len=ival] [--srec-forceS3]
[--redefine-sym old=new]
[--redefine-syms=filename]
[--weaken]
[--keep-symbols=filename]
[--strip-symbols=filename]
[--strip-unneeded-symbols=filename]
[--keep-global-symbols=filename]
[--localize-symbols=filename]
[--weaken-symbols=filename]
[--add-symbol name=[section:]value[,flags]]
[--alt-machine-code=index]
[--prefix-symbols=string]
[--prefix-sections=string]
[--prefix-alloc-sections=string]
[--add-gnu-debuglink=path-to-file]
[--only-keep-debug]
[--strip-dwo]
[--extract-dwo]
[--extract-symbol]
[--writable-text]
[--readonly-text]
[--pure]
[--impure]
[--file-alignment=num]
[--heap=size]
[--image-base=address]
[--section-alignment=num]
[--stack=size]
[--subsystem=which:major.minor]
[--compress-debug-sections]
[--decompress-debug-sections]
[--elf-stt-common=val]
[--merge-notes]
[--no-merge-notes]
[--verilog-data-width=val]
[-v|--verbose]
[-V|--version]
[--help] [--info]
infile [outfile]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# 5.objdump
⭐️
objdump [-a|--archive-headers]
[-b bfdname|--target=bfdname]
[-C|--demangle[=style] ]
[-d|--disassemble[=symbol]]
[-D|--disassemble-all]
[-z|--disassemble-zeroes]
[-EB|-EL|--endian={big | little }]
[-f|--file-headers]
[-F|--file-offsets]
[--file-start-context]
[-g|--debugging]
[-e|--debugging-tags]
[-h|--section-headers|--headers]
[-i|--info]
[-j section|--section=section]
[-l|--line-numbers]
[-S|--source]
[--source-comment[=text]]
[-m machine|--architecture=machine]
[-M options|--disassembler-options=options]
[-p|--private-headers]
[-P options|--private=options]
[-r|--reloc]
[-R|--dynamic-reloc]
[-s|--full-contents]
[-W[lLiaprmfFsoORtUuTgAck]|
--dwarf[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=framesinterp,=str,=str-offsets,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links]]
[-WK|--dwarf=follow-links]
[-WN|--dwarf=no-follow-links]
[-L|--process-links]
[--ctf=section]
[-G|--stabs]
[-t|--syms]
[-T|--dynamic-syms]
[-x|--all-headers]
[-w|--wide]
[--start-address=address]
[--stop-address=address]
[--no-addresses]
[--prefix-addresses]
[--[no-]show-raw-insn]
[--adjust-vma=offset]
[--dwarf-depth=n]
[--dwarf-start=n]
[--ctf-parent=section]
[--no-recurse-limit|--recurse-limit]
[--special-syms]
[--prefix=prefix]
[--prefix-strip=level]
[--insn-width=width]
[--visualize-jumps[=color|=extended-color|=off]
[-V|--version]
[-H|--help]
objfile...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 6.ranlib
✔️
ranlib [--plugin name] [-DhHvVt] archive
ranlib
生成归档内容的索引,并将其存储在归档(archive)中。索引列出了由可重定位对象文件的归档成员定义的每个符号。您可以使用
nm -s
或nm --print-armap
来列出该索引具有这种索引的档案加快了到库的链接,并允许库中的例程相互调用,而不考虑它们在档案中的位置。
GNU
ranlib
程序是GNUar
的另一种形式;运行ranlib
完全等同于执行“ar -s
”。参见第1章第1页。
-h
或-H
或者--help
- Show usage information for ranlib.
- 显示
ranlib
的使用信息。
-v
或者-V
或者--version
- 显示
ranlib
的版本号
# 07.size
⭐️✔️
size [-A|-B|-G|--format=compatibility]
[--help]
[-d|-o|-x|--radix=number]
[--common]
[-t|--totals]
[--target=bfdname] [-V|--version]
[objfile...]
2
3
4
5
6
7
The gnu size utility lists the section sizes and the total size for each of the binary files objfile on its argument list. By default, one line of output is generated for each file or each module if the file is an archive
GNU size
实用程序在其参数列表中列出了每个二进制文件objfile
的section
(节)大小和总大小。默认情况下,如果文件是归档文件,则为每个文件或每个模块生成一行输出
objfile...
是要检查的文件。如果没有指定,将使用文件a.out
命令行选项有以下含义:
-A
-B
-G
--format=compatibility
- 使用这些选项之一,您可以选择GNU
size
的输出是否- 类似于System V
size
(使用-A
,或--format=sysv
) - 或Berkeley
size
(使用-B
,或-format=berkeley
)的输出。 - 默认值是类似于Berkeley’s.的单行格式(one-line format)
- 或者,您可以选择GNU格式输出(使用
-G
,或--format=gnu
),这类似于Berkeley的输出格式,但大小的计数不同。
- 类似于System V
compatibility,兼容性(网络释义),n.和睦相处
以下是**Berkeley (default)**输出格式的size
示例:
$ size --format=Berkeley ranlib size
text data bss dec hex filename
294880 81920 11592 388392 5ed28 ranlib
294880 81920 11888 388688 5ee50 size
2
3
4
The Berkeley style output counts 只读数据(read only data)in the text column, not in the data column,dec
和hex
列都分别以十进制和十六进制显示text
、data
和bss
列的总和
GNU格式统计数据列中的只读数据,而不是文本列,并且只在总计列中显示一次文本、数据和bss列的总和。基数选项可用于更改所有列的基数。下面是用GNU约定显示的相同数据:
$ size --format=GNU ranlib size
text data bss total filename
279880 96920 11592 388392 ranlib
279880 96920 11888 388688 size
2
3
4
这是相同的数据,但显示更接近System V的惯例:
$ size --format=SysV ranlib size
ranlib :
section size addr
.text 294880 8192
.data 81920 303104
.bss 11592 385024
Total 388392
size :
section size addr
.text 294880 8192
.data 81920 303104
.bss 11888 385024
Total 388688
2
3
4
5
6
7
8
9
10
11
12
13
--help
- Show a summary of acceptable arguments and options.
-d
-o
-x
--radix=number
使用这些选项之一,您可以控制每个部分的大小是否以十进制(-d,或- radix=10)给出;八进制(-o,或-基数= 8);或十六进制(-x,或- radix=16)。In - radix=number,仅支持三个值(8、10、16)。总尺寸总是以两个根给出;十进制和十六进制表示-d或-x输出,或者八进制和十六进制表示-o。
--common
打印每个文件中常用符号的总大小。当使用伯克利或GNU格式时,这些都包含在bss大小中。
-t
--totals
- 显示列出的所有对象(objects)的总数(仅限Berkeley或GNU 格式模式)
--target=bfdname
指定objfile的目标代码格式为bfdname。此选项可能不是必需的;大小可以自动识别许多格式。参见第18.1节 [目标选择],第86页,了解更多信息。
-V
或者--version
Display the version number of size.
# 08.strings
strings [-afovV] [-min-len]
[-n min-len] [--bytes=min-len]
[-t radix] [--radix=radix]
[-e encoding] [--encoding=encoding]
[-] [--all] [--print-file-name]
[-T bfdname] [--target=bfdname]
[-w] [--include-all-whitespace]
[-s] [--output-separatorsep_string]
[--help] [--version] file...
2
3
4
5
6
7
8
9
# 09.strip
strip [-F bfdname |--target=bfdname]
[-I bfdname |--input-target=bfdname]
[-O bfdname |--output-target=bfdname]
[-s|--strip-all]
[-S|-g|-d|--strip-debug]
[--strip-dwo]
[-K symbolname|--keep-symbol=symbolname]
[-M|--merge-notes][--no-merge-notes]
[-N symbolname |--strip-symbol=symbolname]
[-w|--wildcard]
[-x|--discard-all] [-X |--discard-locals]
[-R sectionname |--remove-section=sectionname]
[--keep-section=sectionpattern]
[--remove-relocations=sectionpattern]
[-o file] [-p|--preserve-dates]
[-D|--enable-deterministic-archives]
[-U|--disable-deterministic-archives]
[--keep-section-symbols]
[--keep-file-symbols]
[--only-keep-debug]
[-v |--verbose] [-V|--version]
[--help] [--info]
objfile...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 10.c++filt
c++filt [-_|--strip-underscore]
[-n|--no-strip-underscore]
[-p|--no-params]
[-t|--types]
[-i|--no-verbose]
[-r|--no-recurse-limit]
[-R|--recurse-limit]
[-s format|--format=format]
[--help] [--version] [symbol...]
2
3
4
5
6
7
8
9
# 11.addr2line
addr2line [-a|--addresses]
[-b bfdname|--target=bfdname]
[-C|--demangle[=style]]
[-r|--no-recurse-limit]
[-R|--recurse-limit]
[-e filename|--exe=filename]
[-f|--functions] [-s|--basename]
[-i|--inlines]
[-p|--pretty-print]
[-j|--section=name]
[-H|--help] [-V|--version]
[addr addr ...]
2
3
4
5
6
7
8
9
10
11
12
# 12.windmc
「Windows」
windmc可能用于生成Windows消息资源。
# 13.windres
「Windows」
windres可能被用来操纵Windows资源
# 14.dlltool
dlltool用于在理解PE格式图像文件的系统(如Windows)上创建创建动态链接库(dll)所需的文件。DLL包含一个导出表,该表包含运行时加载程序解析引用时所需的信息 参考程序。
dlltool [-d|--input-def def-file-name]
[-b|--base-file base-file-name]
[-e|--output-exp exports-file-name]
[-z|--output-def def-file-name]
[-l|--output-lib library-file-name]
[-y|--output-delaylib library-file-name]
[--export-all-symbols] [--no-export-all-symbols]
[--exclude-symbols list]
[--no-default-excludes]
[-S|--as path-to-assembler] [-f|--as-flags options]
[-D|--dllname name] [-m|--machine machine]
[-a|--add-indirect]
[-U|--add-underscore] [--add-stdcall-underscore]
[-k|--kill-at] [-A|--add-stdcall-alias]
[-p|--ext-prefix-alias prefix]
[-x|--no-idata4] [-c|--no-idata5]
[--use-nul-prefixed-import-tables]
[-I|--identify library-file-name] [--identify-strict]
[-i|--interwork]
[-n|--nodelete] [-t|--temp-prefix prefix]
[-v|--verbose]
[-h|--help] [-V|--version]
[--no-leading-underscore] [--leading-underscore]
[object-file ...]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 14.1.The format of the dlltool .def
file
# 15.readelf
⭐️
readelf [-a|--all]
[-h|--file-header]
[-l|--program-headers|--segments]
[-S|--section-headers|--sections]
[-g|--section-groups]
[-t|--section-details]
[-e|--headers]
[-s|--syms|--symbols]
[--dyn-syms|--lto-syms]
[--sym-base=[0|8|10|16]]
[--demangle=style|--no-demangle]
[--quiet]
[--recurse-limit|--no-recurse-limit]
[-n|--notes]
[-r|--relocs]
[-u|--unwind]
[-d|--dynamic]
[-V|--version-info]
[-A|--arch-specific]
[-D|--use-dynamic]
[-L|--lint|--enable-checks]
[-x <number or name>|--hex-dump=<number or name>]
[-p <number or name>|--string-dump=<number or name>]
[-R <number or name>|--relocated-dump=<number or name>]
[-z|--decompress]
[-c|--archive-index]
[-w[lLiaprmfFsoORtUuTgAck]|
--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=framesinterp,=str,=str-offsets,=loc,=Ranges,=pubtypes,=trace_info,=trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links]]
[-wK|--debug-dump=follow-links]
[-wN|--debug-dump=no-follow-links]
[-P|--process-links]
[--dwarf-depth=n]
[--dwarf-start=n]
[--ctf=section]
[--ctf-parent=section]
[--ctf-symbols=section]
[--ctf-strings=section]
[-I|--histogram]
[-v|--version]
[-W|--wide]
[-T|--silent-truncation]
[-H|--help]
elffile...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- readelf 显示有关一个或多个 ELF 格式目标文件的信息。 选项控制要显示的特定信息。
elffile...
是要检查的目标文件。 支持 32 位和 64 位 ELF 文件,以及包含 ELF 文件的档案(archives)- 该程序执行与 objdump ==类似的功能==,但它更详细,并且它独立于 BFD库而存在,因此如果 BFD 中存在错误,则 readelf 不会受到影响。
- 此处显示为备选方案的长选项和短选项是等效的。 除了“-v”或“-H”之外,必须至少给出一个选项。
-a或者--all
- 等同于指定
--file-header
、--program-headers
、--sections
、--symbols
、--relocs、--dynamic、--notes、--version-info、--archspecific、--unwind、- -section-groups 和--histogram。 - 注意:此选项不会启用
--use-dynamic
本身,因此如果命令行上不存在该选项,则不会显示动态符号(dynamic symbols)动态重新定位( dynamic relocs)
-h或者--file-header
- 显示文件开头的 ELF 头中包含的信息
-l或者--program-headers或者--segments
- 显示包含在文件段头中的信息(如果有的话)
--quiet
- 抑制“无符号(no symbols)”诊断。
-S或者--sections或者--section-headers
- 显示文件的部分标题中包含的信息(如果有)
-g或者--section-groups
- 显示文件的节组(file’s section groups)中包含的信息(如果有)
-t
--section-details
- 显示详细的部分信息。 意味着-S。
-s
--symbols
--syms
- 显示文件的符号表部分中的条目(如果有的话)。 如果符号具有与其关联的版本信息,则也会显示该信息。 版本字符串显示为符号名称的后缀,前面是@character。例如‘foo@VER_1’。 如果版本是解析对符号的未版本化引用时要使用的默认版本,则它显示为后缀,后缀为两个 @ 字符。 例如‘foo@@VER_2’。
--dyn-syms
显示文件的动态符号表部分中的条目(如果有的话)。
输出格式与 --syms
选项使用的格式相同。
# 16.elfedit
✔️
elfedit [--input-mach=machine]
[--input-type=type]
[--input-osabi=osabi]
--output-mach=machine
--output-type=type
--output-osabi=osabi
--enable-x86-feature=feature
--disable-x86-feature=feature
[-v|--version]
[-h|--help]
elffile...
2
3
4
5
6
7
8
9
10
11
elfedit
更新具有匹配 ELF 机器和文件类型的 ELF 文件的 ELF头(ELF header)和程序属性。 这些选项控制应如何更新 ELF头和程序属性中的哪些字段以及应更新哪些字段。elffile...
支持 32 位和 64 位 ELF的文件,以及包含 ELF 文件的存档(archives)此处显示为备选方案的长选项和短选项是等效的。 必须至少提供
--output-mach
、--output-type
、--output-osabi
、--enable-x86-feature
和--disable-x86-feature
选项之一
--input-mach=machine
- 将匹配的输入 ELF 机器类型设置为 machine。 如果未指定
--input-mach
,它将匹配任何 ELF 机器类型。 - 支持的 ELF 机器类型为
i386
、IAMCU
、L1OM
、K1OM
和x86-64
。
--output-mach=machine
- 将 ELF头中的 ELF 机器类型更改为 machine。 支持的 ELF 机器类型与
--input-mach
相同。
--input-type=type
- 将匹配的输入ELF文件类型设置为 type。 如果未指定
--input-type
,它将匹配任何 ELF 文件类型。 - 支持的 ELF 文件类型有
rel
、exec
和dyn
--output-type=type
- 将 ELF 头中的 ELF 文件类型更改为 type。 支持的 ELF 类型与
--input-type
相同
--input-osabi=osabi
- 将匹配的输入 ELF 文件 OSABI 设置为 osabi。 如果未指定
--input-osabi
,它将匹配任何 ELF OSABIs - 支持的 ELF OSABIs 包括:none、HPUX、NetBSD、GNU、Linux(GNU 的别名)、Solaris、AIX、Irix、FreeBSD、TRU64、Modesto、OpenBSD、OpenVMS、NSK、AROS 和 FenixOS
--output-osabi=osabi
- 将 ELF 标头中的 ELF OSABI 更改为 osabi。 支持的 ELF OSABI 与
--input-osabi
相同
--enable-x86-feature=feature
- 在机器类型为
i386
或x86-64
的 exec 或 dyn ELF 文件的程序属性中设置功能位。 支持的功能有 ibt、shstk、lam_u48 和 lam_u57。
--disable-x86-feature=feature
- 清除机器类型为 i386 或 x86-64 的 exec 或 dyn ELF 文件中程序属性中的功能位。 支持的功能与
--enable-x86-feature
相同。 - 注意:
--enable-x86-feature
和--disable-x86-feature
仅在支持‘mmap’的主机上可用。
-v
或者 --version
- 显示elfedit的版本号
-h
或者--help
- 显示 elfedit 理解的命令行选项
# 17.公共选项Common Options✔️
- 公共选项、常用选项。common,一般的;常见的;公共的;
本手册中描述的所有程序都支持以下命令行(command-line)选项。
@file
- 从文件中读取命令行选项。读取选项被插入来代替原来的
@file
选项。如果文件不存在,或者无法读取,那么该选项将被视为字面上的,而不是删除。 - 文件中的选项由空格分隔。一个空格字符可以包含在一个选项中,方法是用单引号或双引号将整个选项括起来 引语。任何字符(包括反斜杠)都可以通过在要包含的字符前加上反斜杠来包含。文件本身可能包含其他
@file
选项;任何这样的选项都将被递归处理
- 从文件中读取命令行选项。读取选项被插入来代替原来的
--help
- 显示程序支持的命令行选项。
--version
- 显示程序的版本号(version number)
# 18.选择目标系统Selecting the Target System✔️
您可以向GNU二进制文件实用程序指定目标系统的两个方面,每个方面都有几种方式:
- the target
- the architecture
在以下摘要中,指定值的方法列表按优先级递减的顺序排列。首先列出的方法会覆盖后面列出的方法。
列出有效值的命令仅列出您正在运行的程序所配置的值。如果它们被配置为-enable-targets=all
,则命令会列出大部分可用值,但会遗漏一些值;并非所有目标都可以一次在中配置,因为其中一些目标只能配置为本机目标(在与目标系统类型相同的主机上)。
# 18.1.目标选择Target Selection
目标是一种目标文件格式。多个体系结构可能支持一个给定的目标(参见第87页第18.2节[体系结构选择])。对于不同的操作系统或体系结构,目标选择也可能有所不同。
列出有效目标值的命令是“objdump -i
”(输出的第一列包含相关信息)。
一些示例值为:“a.out-hp300bsd”、“ecoff-littlemips”、“a.out-sunos-big”。
您也可以使用配置三元组来指定目标。这与传递给配置以指定目标的名称相同。当您使用配置三元组作为参数时,它必须完全规范化。您可以通过运行源代码中包含的shell脚本config.sub来查看三元组的规范版本。
一些示例配置三元组是:‘m68k-HP-BSD’、‘MIPS-dec-ultrix’、‘SPARC-sun-sunos’。
# objdump Target
指定方式:
- 1.命令行选项:-b或- target
- 2.环境变量GNUTARGET
- 3.从输入文件推断
# objcopy and strip Input Target
指定方式:
- 1.命令行选项:-I或-输入-目标,或-F或-目标
- 2.环境变量GNUTARGET
- 3.从输入文件推断
# objcopy and strip Output Target
指定方式:
- 1.命令行选项:-O或-输出-目标,或-F或-目标
- 2.输入目标(参见上面的“对象复制和剥离输入目标”)
- 3.环境变量GNUTARGET
- 4.从输入文件推断
# nm, size, and strings Target
指定方式:
- 1.命令行选项:-目标
- 2.环境变量GNUTARGET
- 3.从输入文件推断
# 18.2.架构(体系结构)选择Architecture Selection
体系结构是一种运行目标文件的==CPU==。
它的名称可能包含一个冒号,将处理器家族的名称与特定cpu的名称分开。
列出有效架构值的命令是“objdump -i”(第二列包含相关信息)。 示例值:“m68k:68020”、“mips:3000”、“sparc”
# objdump Architecture
指定方式:
- 1.命令行选项:-m或-架构
- 2.从输入文件推断
# objcopy, nm, size, strings Architecture
指定方式:
- 1.从输入文件推断
# 19.debuginfod「不是命令」
debuginfod是一个web服务,它通过构建id索引ELF/DWARF调试资源,并通过HTTP为它们提供服务
使用-with-debugginfod配置选项,可以使用debuginfod客户端库libdebuginfod构建Binutils。默认情况下,如果libdebuginfod 在配置时安装并找到。这允许objdump和readelf在找不到文件时,自动向debuginfod服务器查询单独的调试文件。从0.178版本开始,debuginfod与elfutils打包在一起。
You can get the latest version from ‘https://sourceware.org/elfutils/’.
# 20.报告错误
- Reporting Bugs
- 翻译略
# 20.1.Have You Found a Bug?
# 20.2.How to Report Bugs
# Appendix「附录」 A GNU Free Documentation License
- 翻译略
# Binutils Index
- 翻译略
# 参考资料
- GNU Binutils官方文档,网站:https://sourceware.org/binutils/ (opens new window)
- GNU软件,官方网站:https://www.gnu.org/software/software.html (opens new window)