更新升级 专属应用 系统故障 硬件故障 电脑汽车 鸿蒙刷机 鸿蒙开发Linux教程 鸿蒙开发Linux命令
当前位置:HMXT之家 > 鸿蒙开发Linux命令 > Linux od、objdump、objcopy、open命令的用法及解释

Linux od、objdump、objcopy、open命令的用法及解释

更新时间:2022-01-20 15:40:49浏览次数:874+次

以下为你详细解释od、objdump、objcopy、open命令的用法。

\

Linux od命令的用法及解释

Linux od命令用于输出文件的八进制、十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符。

常见的文件为文本文件和二进制文件。此命令主要用来查看保存在二进制文件中的值。比如,程序可能输出大量的数据记录,每个数据是一个单精度浮点数。这些数据记录存放在一个文件中,如果想查看下这个数据,这时候od命令就派上用场了。在我看来,od命令主要用来格式化输出文件数据,即对文件中的数据进行无二义性的解释。不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。

1、语法

od(选项)(参数)

2、选项

-a:此参数的效果和同时指定“-ta”参数相同;

-A:<字码基数>:选择以何种基数计算字码;

-b:此参数的效果和同时指定“-toC”参数相同;

-c:此参数的效果和同时指定“-tC”参数相同;

-d:此参数的效果和同时指定“-tu2”参数相同;

-f:此参数的效果和同时指定“-tfF”参数相同;

-h:此参数的效果和同时指定“-tx2”参数相同;

-i:此参数的效果和同时指定“-td2”参数相同;

-j<字符数目>或--skip-bytes=<字符数目>:略过设置的字符数目;

-l:此参数的效果和同时指定“-td4”参数相同;

-N<字符数目>或--read-bytes=<字符数目>:到设置的字符树目为止;

-o:此参数的效果和同时指定“-to2”参数相同;

-s<字符串字符数>或--strings=<字符串字符数>:只显示符合指定的字符数目的字符串;

-t<输出格式>或--format=<输出格式>:设置输出格式;

-v或--output-duplicates:输出时不省略重复的数据;

-w<每列字符数>或--width=<每列字符数>:设置每列的最大字符数;

-x:此参数的效果和同时指定“-h”参数相同;

--help:在线帮助;

--version:显示版本信息。

3、参数

文件:指定要显示的文件。

4、实例

[hmxthome@localhost ~]$ echo abcdef g > tmp

[hmxthome@localhost ~]$ cat tmp

abcdef g

说明:先准备一个tmp文件。

[hmxthome@localhost ~]$ od -b tmp

0000000 141 142 143 144 145 146 040 147 012

0000011

说明:使用单字节八进制解释进行输出,注意左侧的默认地址格式为八字节。

[hmxthome@localhost ~]$ od -c tmp

0000000   a   b   c   d   e   f       g  \n

0000011

说明:使用ASCII码进行输出,注意其中包括转义字符。

[hmxthome@localhost ~]$ od -t d1 tmp

0000000   97   98   99  100  101  102   32  103   10

0000011

说明:使用单字节十进制进行解释。

[hmxthome@localhost ~]$ od -A d -c tmp

0000000   a   b   c   d   e   f       g  \n

0000009

说明:设置地址格式为十进制。

[hmxthome@localhost ~]$ od -A x -c tmp

000000   a   b   c   d   e   f       g  \n

000009

说明:设置地址格式为十六进制。

[hmxthome@localhost ~]$ od -j 2 -c tmp

0000002   c   d   e   f       g  \n

0000011

说明:跳过开始的两个字节。

[hmxthome@localhost ~]$ od -N 2 -j 2 -c tmp

0000002   c   d

0000004

说明:跳过开始的两个字节,并且仅输出两个字节。

[hmxthome@localhost ~]$ od -w1 -c tmp

0000000   a

0000001   b

0000002   c

0000003   d

0000004   e

0000005   f

0000006   

0000007   g

0000010  \n

0000011

说明:每行仅输出1个字节。

[hmxthome@localhost ~]$ od -w2 -c tmp

0000000   a   b

0000002   c   d

0000004   e   f

0000006       g

0000010  \n

0000011

说明:每行输出两个字节。

[hmxthome@localhost ~]$ od -w3 -b tmp

0000000 141 142 143

0000003 144 145 146

0000006 040 147 012

0000011

说明:每行输出3个字节,并使用八进制单字节进行解释。

Linux objdump命令的用法及解释

Linux objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。

1、选项

--archive-headers

-a

显示档案库的成员信息,类似ls -l将lib*.a的信息列出。

-b bfdname

--target=bfdname

指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如:

objdump -b oasys -m vax -h fu.o

显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。

-C

--demangle

将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。

--debugging

-g

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

-e

--debugging-tags

类似-g选项,但是生成的信息是和ctags工具相兼容的格式。

--disassemble

-d

从objfile中反汇编那些特定指令机器码的section。

-D

--disassemble-all

与 -d 类似,但反汇编所有section.

--prefix-addresses

反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。

-EB

-EL

--endian={big|little}

指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records.

-f

--file-headers

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

-h

--section-headers

--headers

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

-H

--help

简短的帮助信息。

-i

--info

显示对于 -b 或者 -m 选项可用的架构和目标格式列表。

-j name

--section=name

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

-l

--line-numbers

用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

-m machine

--architecture=machine

指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.

--reloc

-r

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

--dynamic-reloc

-R

显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。

-s

--full-contents

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

-S

--source

尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。

--show-raw-insn

反汇编的时候,显示每条汇编指令对应的机器码,如不指定--prefix-addresses,这将是缺省选项。

--no-show-raw-insn

反汇编时,不显示汇编指令的机器码,如不指定--prefix-addresses,这将是缺省选项。

--start-address=address

从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。

--stop-address=address

显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出。

-t

--syms

显示文件的符号表入口。类似于nm -s提供的信息

-T

--dynamic-syms

显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D|--dynamic 显示的信息。

-V

--version

版本信息

--all-headers

-x

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

-z

--disassemble-zeroes

一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。

@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。

2、实例

首先,在给出后面大部分测试所基于的源代码以及编译指令。 源代码如下:

[root@localhost test]# nl mytest.cpp

void printTest() {

    char a;

    a = 'a';

}

void printTest2() {

int a = 2;

a+=2;

}

对以上源代码进行编译,如下:

[root@localhost test]# g++ -c -g mytest.cpp

这里,生成的文件是mytest.o,为了方便测试包含了调试的信息,对可执行文件的测试,显示的结果类似。

查看当前使用的objdump的版本号:

[root@localhost test]# objdump -V

GNU objdump 2.17.50.0.6-14.el5 20171020

Copyright 2017 free Software Foundation, Inc.

This program is free software; you may redistribute it under the terms of

the GNU General Public License.  This program has absolutely no warranty.

查看档案库文件中的信息:

[root@localhost test]# objdump -a libmy2.a

In archive libmy2.a:

myfile.o:     file format elf32-i386

rwxrwxrwx 0/0   2724 Nov 16 16:06 2017 myfile.o

mytest.o:     file format elf32-i386

rw-r--r-- 0/0    727 Jul 13 15:32 2017 mytest.o

这里,libmy2.a是一个使用ar命令将多个*.o目标文件打包而生成的静态库。命令的输出类似ar -tv,相比较ar -tv输出如下:

[root@localhost test]# ar -tv libmy2.a

rwxrwxrwx 0/0   2724 Nov 16 16:06 2017 myfile.o

rw-r--r-- 0/0    727 Jul 13 15:32 2011 mytest.o

显示可用的架构和目标结构列表:

[root@localhost test]# objdump -i

BFD header file version 2.17.50.0.6-14.el5 20171020

elf32-i386

(header little endian, data little endian)

  i386

a.out-i386-linux

(header little endian, data little endian)

  i386

efi-app-ia32

(header little endian, data little endian)

  i386

elf64-x86-64

(header little endian, data little endian)

  i386

elf64-little

(header little endian, data little endian)

  i386

elf64-big

(header big endian, data big endian)

  i386

elf32-little

(header little endian, data little endian)

  i386

elf32-big

(header big endian, data big endian)

  i386

srec

(header endianness unknown, data endianness unknown)

  i386

symbolsrec

(header endianness unknown, data endianness unknown)

  i386

tekhex

(header endianness unknown, data endianness unknown)

  i386

binary

(header endianness unknown, data endianness unknown)

  i386

ihex

(header endianness unknown, data endianness unknown)

  i386

trad-core

(header endianness unknown, data endianness unknown)

              elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64

          i386 elf32-i386 a.out-i386-linux efi-app-ia32 elf64-x86-64

              elf64-little elf64-big elf32-little elf32-big srec symbolsrec

          i386 elf64-little elf64-big elf32-little elf32-big srec symbolsrec

              tekhex binary ihex trad-core

          i386 tekhex binary ihex ---------

这里,显示的信息是相对于 -b 或者 -m 选项可用的架构和目标格式列表。

显示mytest.o文件中的text段的内容:

[root@localhost test]# objdump --section=.text -s mytest.o

mytest.o:     file format elf32-i386

Contents of section .text:

0000 5589e583 ec10c645 ff61c9c3 5589e583  U......E.a..U...

0010 ec10c745 fc020000 008345fc 02c9c3    ...E......E....

这里注意,不能单独使用-j或者--section,例如objdump --section=.text mytest.o是不会运行成功的。

反汇编mytest.o中的text段内容,并尽可能用源代码形式表示:

[root@localhost test]# objdump -j .text -S mytest.o

mytest.o:     file format elf32-i386 

Disassembly of section .text: 

00000000 <_Z9printTestv>: 

void printTest() 

0:   55                      push   %ebp 

1:   89 e5                   mov    %esp,%ebp 

3:   83 ec 10                sub    $0x10,%esp 

char a; 

a = 'a'; 

6:   c6 45 ff 61             movb   $0x61,0xffffffff(%ebp) 

a:   c9                      leave  

b:   c3                      ret    

000000c <_Z10printTest2v>: 

void printTest2() 

c:   55                      push   %ebp 

d:   89 e5                   mov    %esp,%ebp 

f:   83 ec 10                sub    $0x10,%esp 

int a = 2; 

12:   c7 45 fc 02 00 00 00    movl   $0x2,0xfffffffc(%ebp) 

a+=2; 

19:   83 45 fc 02             addl   $0x2,0xfffffffc(%ebp) 

1d:   c9                      leave  

1e:   c3                      ret

这里注意,不能单独使用-j或者--section,例如objdump -j .text mytest.o是不会运行成功的。另外-S命令对于包含调试信息的目标文件,显示的效果比较好,如果编译时没有指定g++的-g选项,那么目标文件就不包含调试信息,那么显示效果就差多了。

反汇编出mytest.o的源代码:

[root@localhost test]# objdump -S mytest.o

mytest.o:     file format elf32-i386 

Disassembly of section .text: 

00000000 <_Z9printTestv>: 

void printTest() 

0:   55                      push   %ebp 

1:   89 e5                   mov    %esp,%ebp 

3:   83 ec 10                sub    $0x10,%esp 

char a; 

a = 'a'; 

6:   c6 45 ff 61             movb   $0x61,0xffffffff(%ebp) 

a:   c9                      leave  

b:   c3                      ret    

0000000c <_Z10printTest2v>: 

void printTest2() 

c:   55                      push   %ebp 

d:   89 e5                   mov    %esp,%ebp 

f:   83 ec 10                sub    $0x10,%esp 

int a = 2; 

12:   c7 45 fc 02 00 00 00    movl   $0x2,0xfffffffc(%ebp) 

a+=2; 

19:   83 45 fc 02             addl   $0x2,0xfffffffc(%ebp) 

1d:   c9                      leave  

1e:   c3                      ret

这里,尤其当编译的时候指定了-g这种调试参数时,反汇编的效果比较明显。隐含了-d参数。

显示文件的符号表入口:

[root@localhost test]# objdump -t mytest.o

mytest.o:     file format elf32-i386 

SYMBOL TABLE: 

00000000 l    df *ABS*  00000000 mytest.cpp 

00000000 l    d  .text  00000000 .text 

00000000 l    d  .data  00000000 .data 

00000000 l    d  .bss   00000000 .bss 

00000000 l    d  .debug_abbrev  00000000 .debug_abbrev 

00000000 l    d  .debug_info    00000000 .debug_info 

00000000 l    d  .debug_line    00000000 .debug_line 

00000000 l    d  .debug_frame   00000000 .debug_frame 

00000000 l    d  .debug_loc     00000000 .debug_loc 

00000000 l    d  .debug_pubnames        00000000 .debug_pubnames 

00000000 l    d  .debug_aranges 00000000 .debug_aranges 

00000000 l    d  .note.GNU-stack        00000000 .note.GNU-stack 

00000000 l    d  .comment       00000000 .comment 

00000000 g     F .text  0000000c _Z9printTestv 

00000000         *UND*  00000000 __gxx_personality_v0 

0000000c g     F .text  00000013 _Z10printTest2v

这里,输出的信息类似nm -s命令的输出,相比较之下,nm命令的输出如下:

[root@localhost test]# nm -s mytest.o

0000000c T _Z10printTest2v 

00000000 T _Z9printTestv 

U __gxx_personality_v0

显示文件的符号表入口,将底层符号解码并表示成用户级别:

[root@localhost test]# objdump -t -C mytest.o

mytest.o:     file format elf32-i386 

SYMBOL TABLE: 

00000000 l    df *ABS*  00000000 mytest.cpp 

00000000 l    d  .text  00000000 .text 

00000000 l    d  .data  00000000 .data 

00000000 l    d  .bss   00000000 .bss 

00000000 l    d  .debug_abbrev  00000000 .debug_abbrev 

00000000 l    d  .debug_info    00000000 .debug_info 

00000000 l    d  .debug_line    00000000 .debug_line 

00000000 l    d  .debug_frame   00000000 .debug_frame 

00000000 l    d  .debug_loc     00000000 .debug_loc 

00000000 l    d  .debug_pubnames        00000000 .debug_pubnames 

00000000 l    d  .debug_aranges 00000000 .debug_aranges 

00000000 l    d  .note.GNU-stack        00000000 .note.GNU-stack 

00000000 l    d  .comment       00000000 .comment 

00000000 g     F .text  0000000c printTest() 

00000000         *UND*  00000000 __gxx_personality_v0 

0000000c g     F .text  00000013 printTest2()

这里,和没-C相比,printTest2函数可读性增加了。

反汇编目标文件的特定机器码段:

[root@localhost test]# objdump -d mytest.o

mytest.o:     file format elf32-i386 

Disassembly of section .text: 

00000000 <_Z9printTestv>: 

0:   55                      push   %ebp 

1:   89 e5                   mov    %esp,%ebp 

3:   83 ec 10                sub    $0x10,%esp 

6:   c6 45 ff 61             movb   $0x61,0xffffffff(%ebp) 

a:   c9                      leave  

b:   c3                      ret    

0000000c <_Z10printTest2v>: 

c:   55                      push   %ebp 

d:   89 e5                   mov    %esp,%ebp 

f:   83 ec 10                sub    $0x10,%esp 

12:   c7 45 fc 02 00 00 00    movl   $0x2,0xfffffffc(%ebp) 

19:   83 45 fc 02             addl   $0x2,0xfffffffc(%ebp) 

1d:   c9                      leave  

1e:   c3                      ret

这里,对text段的内容进行了反汇编。

反汇编特定段,并将汇编代码对应的文件名称和行号对应上:

[root@localhost test]# objdump -d -l mytest.o

mytest.o:     file format elf32-i386 

Disassembly of section .text: 

00000000 <_Z9printTestv>: 

_Z9printTestv(): 

/root/test/04_libraryTest/mytest.cpp:1 

0:   55                      push   %ebp 

1:   89 e5                   mov    %esp,%ebp 

3:   83 ec 10                sub    $0x10,%esp 

/root/test/04_libraryTest/mytest.cpp:4 

6:   c6 45 ff 61             movb   $0x61,0xffffffff(%ebp) 

/root/test/04_libraryTest/mytest.cpp:5 

a:   c9                      leave  

b:   c3                      ret    

0000000c <_Z10printTest2v>: 

_Z10printTest2v(): 

/root/test/04_libraryTest/mytest.cpp:6 

c:   55                      push   %ebp 

d:   89 e5                   mov    %esp,%ebp 

f:   83 ec 10                sub    $0x10,%esp 

/root/test/04_libraryTest/mytest.cpp:8 

12:   c7 45 fc 02 00 00 00    movl   $0x2,0xfffffffc(%ebp) 

/root/test/04_libraryTest/mytest.cpp:9 

19:   83 45 fc 02             addl   $0x2,0xfffffffc(%ebp) 

/root/test/04_libraryTest/mytest.cpp:10 

1d:   c9                      leave  

1e:   c3                      ret

这里,项"-d"从objfile中反汇编那些特定指令机器码的section,而使用"-l"指定用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用,使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

显示目标文件各个段的头部摘要信息:

[root@localhost test]# objdump -h mytest.o

mytest.o:     file format elf32-i386 

Sections: 

Idx Name          Size      VMA       LMA       File off  Algn 

0 .text         0000001f  00000000  00000000  00000034  2**2 

CONTENTS, ALLOC, LOAD, readonly, CODE 

1 .data         00000000  00000000  00000000  00000054  2**2 

CONTENTS, ALLOC, LOAD, DATA 

2 .bss          00000000  00000000  00000000  00000054  2**2 

ALLOC 

3 .debug_abbrev 00000046  00000000  00000000  00000054  2**0 

CONTENTS, READONLY, DEBUGGING 

4 .debug_info   000000ed  00000000  00000000  0000009a  2**0 

CONTENTS, RELOC, READONLY, DEBUGGING 

5 .debug_line   0000003e  00000000  00000000  00000187  2**0 

CONTENTS, RELOC, READONLY, DEBUGGING 

6 .debug_frame  00000044  00000000  00000000  000001c8  2**2 

CONTENTS, RELOC, READONLY, DEBUGGING 

7 .debug_loc    00000058  00000000  00000000  0000020c  2**0 

CONTENTS, READONLY, DEBUGGING 

8 .debug_pubnames 0000002f  00000000  00000000  00000264  2**0 

CONTENTS, RELOC, READONLY, DEBUGGING 

9 .debug_aranges 00000020  00000000  00000000  00000293  2**0 

CONTENTS, RELOC, READONLY, DEBUGGING 

10 .comment      0000002e  00000000  00000000  000002b3  2**0 

CONTENTS, READONLY 

11 .note.GNU-stack 00000000  00000000  00000000  000002e1  2**0 

CONTENTS, READONLY

这里,更多的内容参见man objdump中的这个选项。

Linux objcopy命令的用法及解释

Linux objcopy命令是将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换。

1、描述

objcopy工具使用BFD库读写目标文件,它可以将一个目标文件的内容拷贝到另外一个目标文件当中。objcopy通过它的选项来控制其不同的动作,它可以将目标文件拷贝成和原来的文件不一样的格式。需要注意的是objcopy能够在两种格式之间拷贝一个完全链接的文件,在两种 格式之间拷贝一个可重定位的目标文件可能不会正常地工作。

objcopy在做转换的时候会创建临时文件,然后将这些临时文件删除。objcopy使用BFD来做它所有的转换工作;它访问BFD中描述的所有格式,可以不必指定就识别大多数的格式。

通过指定输出目标为srec(例如 -O srec),objcopy可以用来生成S-record文件。

通过指定输入目标为而进制文件(例如-O binary),objcopy可以生成原始格式的二进制文件。当objcopy生成一个原始格式的二进制文件的时候,它会生成输入的目标文件的基本内存拷贝,然后所有的标号和可重定位信息都会被去掉。内存拷贝开始于最低段的加载地址,拷贝到输出文件。

当生成一个S-record或者原始的二进制文件的时候,可以使用-S这个很有用的选项选项来移除一些包含调试信息的节。有时-R可以用来移除一些二进制文件不需要的节。

注意:objcopy工具不能用来改变文件的大端和小端属性。

2、命令参数

infile/outfile

源文件/目标文件,如果不指定目标文件那么objcopy将会创建一个临时文件,并且将其命名为源文件。

3、命令项

-I bfdname

--input-target=bfdname

    指定输入文件的bfdname,可取值elf32-little,elf32-big等。

-O bfdname

--output-target=bfdname

    指定输出文件的bfdname

-F bfdname

--target=bfdname

    指定输入、输出文件的bfdname,目标文件格式,只用于在目标和源之间传输数据,不转换。

-j sectionname

--only-section=sectionname

    只将由sectionname指定的section拷贝到输出文件,可以多次指定,并且注意如果使用不当会导致输出文件不可用。

-R sectionname

--remove-section=sectionname

    从输出文件中去除掉由sectionname指定的section,可以多次指定,并且注意如果使用不当会导致输出文件不可用。

-S

--strip-all

    不从源文件拷贝符号信息和relocation信息。

-g

--strip-debug

    不从源文件拷贝调试符号信息和相关的段。对使用-g编译生成的可执行文件执行之后, 生成的结果几乎和不用-g进行编译生成可执行文件一样。

--strip-unneeded

    去掉所重定位处理不需要的符号。

-K symbolname

--keep-symbol=symbolname

    strip的时候,保留由symbolname指定的符号信息。可以指定多次。

-N symbolname

--strip-symbol=symbolname

    不拷贝由symbolname指定的符号信息,可以多次指定。

-G symbolname

--keep-global-symbol=symbolname

    只保留symbolname为全局的,让其他的都是文件局部的变量这样外部不可见,这个选项可以多次指定。

-L symbolname

--localize-symbol=symbolname

    将变量symbolname变成文件局部的变量。可以多次指定。

-W symbolname

--weaken-symbol=symbolname

    弱化变量。

--globalize-symbol=symbolname

    让变量symbolname变成全局范围,这样它可以在定义它的文件外部可见。可以多次指定。

-w

--wildcard

    允许对其他命令行项中的symbolnames使用正则表达式。问号(?),星号(*),反斜线(\) ,和中括号([])操作可以用在标号名称的任何位置。如果标号的第一个字符是感叹号(!),那么表示相反的含义,例如:

    -w -W !foo -W fo*

    表示objcopy将要弱化所有以"fo"开头的标号,但是除了标号"foo"。

-x

--discard-all

    不从源文件中拷贝非全局变量。

-X

--discard-locals

    不拷贝编译生成的局部变量(一般以L或者..开头)。

-b byte

--byte=byte

    只保留输入文件的每个第byte个字节(不会影响头部数据)。byte的范围可以是0到 interleave-1。这里,interleave通过-i选项指定,默认为4。将文件创建成程序rom的时候 ,这个命令很有用。它经常用于srec输出目标。

-i interleave

--interleave=interleave

    每隔interleave字节拷贝1 byte。通过-b选项指定选择哪个字节,默认为4。如果不指定 -b那么objcopy会忽略这个选项。

--gap-fill val

    在section之间的空隙中填充val,

--set-start val

    设定新文件的起始地址为val,并不是所有格式的目标文件都支持设置起始地址。

--change-start incr

--adjust-start incr

    通过增加incr量来调整起始地址,并不是所有格式的目标文件都支持设置起始地址。

--change-address incr

--adjust-vma incr

    通过增加incr量调整所有sections的VMA(virtual memory address)和LMA(linear memory address),以及起始地址。

--change-section-address section{=,+,-}val

--adjust-section-vma section{=,+,-}val

    调整指定section的VMA/LMA地址。

--set-section-flags section=flag

    指定指定section的flag,flag的取值可以alloc,contents, load, noload, readonly,  code, data, rom, share, debug。我们可以设置一个没有内容的节的flag,但是清除一个有内容的节的flag是没有意义的--应当把相应的节移除。并不是所有的flags对于所有的目标文件都有意义。

--add-section sectionname=filename

    在拷贝文件的时候,添加一个名为sectionname的section,该section的内容为filename 的内容,大小为文件大小。这个选项只在那些可以支持任意名称section的文件好用。

--rename-section oldname=newname[,flags]

    更改section的名

    将一个section的名字从oldname更改为newname,同时也可以指定更改其flags。这个在执行linker脚本进行重命名的时候,并且输出文件还是一个目标文件并不成为可执行的连接文件,这个时候很有优势。

    这个项在输入文件是binary的时候很有用,因为这经常会创建一个名称为.data的 section,例如,你想创建一个名称为.rodata的包含二进制数据的section,这时候,你可以使用如下命令:

    objcopy -I binary -O <output_format> -B <architecture> \

    --rename-section .data=.rodata,alloc,load,readonly,data,contents \

    <input_binary_file> <output_object_file>

--add-gnu-debuglink=path-to-file

    创建一个.gnu_debuglink节,这个节包含一个特定路径的文件引用,并且把它添加到输出文件中。

--only-keep-debug

    对文件进行strip,移走所有不会被--strip-debug移走的section,并且保持调试相关的 section原封不动。

4、实例

[root@localhost test]# objcopy -O srec main main.srec    #将文件转换成S-record格式

[root@localhost test]# objcopy -O binary main main.bin    #将文件转换成rawbinary 格式

[root@localhost test]# objcopy -S main main.stripall    #生成一个不含重定位以及标号目标文件

[root@localhost test]# objcopy -R .comment main main.remove    #去掉指定名称的节

[root@localhost test]# objcopy --add-section mysection=hello_text main main.add      #添加一个自定义的节到可执行文件并将一个文件内容添加到其中

[root@localhost test]# objcopy -j mysection main.add section_hello     #将指定的段拷贝出来

[root@localhost test]# objcopy --only-keep-debug main.debug main.debuginfo     # 生成调试信息文件

[root@localhost test]# objcopy --strip-debug main.debug main.stripdebug    #生成不含调试信息的可执行文件

[root@localhost test]# objcopy --add-gnu-debuglink=main.debuginfo main.stripdebug     #为不含调试信息的可执行文件添加调试信息

Linux open命令的用法及解释

Linux open命令用来开启虚拟终端,然后执行指定的命令,指定的命令可以包含参数。

1、参数

-l:登陆环境

-s:切换到终端

-u:开启新的终端

-v:运行时显示详细的处理过程

-w:进入等待状态

-c:指定终端

2、实例

[root@localhost test]# open -c 9 -sw --tcpdump #开启终端9并执行tcpdump命令,执行后并等待,知道tcpdump命令完成后才返回

[root@localhost test]# open -c 9 - nslookup  #开启终端9执行 nslookup