目标文件格式分析工具: ar,nm,objdump,objcopy,readelf

2023-11-09

http://www.kgdb.info/linuxdev/object_analyse_tools/

目标文件格式分析工具: ar,nm,objdump,objcopy,readelf

2011年9月5日 reship 发表评论 阅读评论

本文转载自amethyst623的blog

目标文件格式分析工具: ar,nm,objdump,objcopy,readelf

前言


如果普通编程不需要了解这些东西,如果想精确控制你的目标文件的格式或者你想查看一下文件里的内容以便作出某种判断,那么你可以看一下下面的工具:ar,nm,objdump,objcopy。具体用法请参考man在线手册。

ar基本用法



    ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。

  下面是ar命令的格式:

  ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files…

  例如我们可以用ar rv libtest.a hello.o hello1.o
生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-’字符,也可以
没有。下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}部分称为操作选项,而[abcfilNoPsSuvV]部分称为任选项。

  {dmpqrtx}中的操作选项在命令中只能并且必须使用其中一个,它们的含义如下:

  • d:从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v则列出被删除的每个模块。  
  • m:该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任何指定的成员将移到库的最后。也可以使用’a',’b',或’I'任选项移动到指定的位置。  
  • p:显示库中指定的成员到标准输出。如果指定任选项v,则在输出成员的内容前,将显示成员的名字。如果没有指定成员的名字,所有库中的文件将显示出来。  
  • q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。’a',’b',或’I'任选项对此操作没有影响,模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时,库的符号表没有更新,可以用’ar s’或ranlib来更新库的符号表索引。  
  • r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。  
  • t:显示库的模块表清单。一般只显示模块名。  
  • x:从库中提取一个成员。如果不指定要提取的模块,则提取库中所有的模块。

  下面在看看可与操作选项结合使用的任选项:

  • a:在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a,则应该为命令行中membername参数指定一个已经存在的成员名。  
  • b:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项b,则应该为命令行中membername参数指定一个已经存在的成员名。  
  • c:创建一个库。不管库是否存在,都将创建。  
  • f:在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。  
  • i:在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项i,则应该为命令行中membername参数指定一个已经存在的成员名(类似任选项b)。  
  • l:暂未使用  
  • N:与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。  
  • o:当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。  
  • P:进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。  
  • s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。  
  • S:不创建目标文件索引,这在创建较大的库时能加快时间。  
  • u:一般说来,命令ar r…插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于r操作选项。  
  • v:该选项用来显示执行操作选项的附加信息。  
  • V:显示ar的版本。

nm基本用法


   nm用来列出目标文件的符号清单。下面是nm命令的格式:

  nm [-a│--debug-syms] [-g│--extern-only]
[-B] [-C│--demangle[=style]] [-D│--dynamic]
[-S│--print-size] [-s│--print-armap]
[-A│-o│--print-file-name][--special-syms]
[-n│-v│--numeric-sort] [-p│--no-sort]

[-r│--reverse-sort] [--size-sort] [-u│--undefined-only]
[-t radix│--radix=radix] [-P│--portability]
[--target=bfdname] [-f format│--format=format]
[--defined-only] [-l│--line-numbers] [--no-demangle]
[-V│--version] [-X 32_64] [--help]  [objfile...]

  如果没有为nm命令指出目标文件,则nm假定目标文件是a.out。下面列出该命令的任选项,大部分支持”-”开头的短格式和”—”开头的长格式。

  • -A、-o或–print-file-name:在找到的各个符号的名字前加上文件名,而不是在此文件的所有符号前只出现文件名一次。  
        

    例如nm libtest.a的输出如下:

        CPThread.o:
        00000068 T Main__8CPThreadPv
        00000038 T Start__8CPThread
        00000014 T _._8CPThread
        00000000 T __8CPThread
        00000000 ? __FRAME_BEGIN__

        …………………………………
        
        

    则nm -A 的输出如下:

        libtest.a:CPThread.o:00000068 T Main__8CPThreadPv
        libtest.a:CPThread.o:00000038 T Start__8CPThread
        libtest.a:CPThread.o:00000014 T _._8CPThread
        libtest.a:CPThread.o:00000000 T __8CPThread
        libtest.a:CPThread.o:00000000 ? __FRAME_BEGIN__
        …………………………………………………………

        

  • -a或–debug-syms:显示所有的符号,包括debugger-only symbols。  
  • -B:等同于–format=bsd,用来兼容MIPS的nm。  
  • -C或–demangle:将低级符号名解析(demangle)成用户级名字。这样可以使得C++函数名具有可读性。
  • –no-demangle:默认的选项,不需要将低级符号名解析成用户级名
  • -D或–dynamic:显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。  
  • -f format:使用format格式输出。format可以选取bsd、sysv或posix,该选项在GNU的nm中有用。默认为bsd。  
  • -g或–extern-only:仅显示外部符号。  
  • -n、-v或–numeric-sort:按符号对应地址的顺序排序,而非按符号名的字符顺序。  
  • -p或–no-sort:按目标文件中遇到的符号顺序显示,不排序。  
  • -P或–portability:使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。  
  • -s或–print-armap:当列出库中成员的符号时,包含索引。索引的内容包含:哪些模块包含哪些名字的映射。  
  • -r或–reverse-sort:反转排序的顺序(例如,升序变为降序)。  
  • –size-sort:按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。  
  • -t radix或–radix=radix:使用radix进制显示符号值。radix只能为”d”表示十进制、”o”表示八进制或”x”表示十六进制。  
  • –target=bfdname:指定一个目标代码的格式,而非使用系统的默认格式。  
  • -u或–undefined-only:仅显示没有定义的符号(那些外部符号)。
  • –defined-only:仅显示定义的符号。
        
  • -l或–line-numbers:对每个符号,使用调试信息来试图找到文件名和行号。对于已定义的符号,查找符号地址的行号。对于未定义符号,查找符号重定位项的行号。如果可以找到行号信息,显示在符号信息之后。  
  • -V或–version:显示nm的版本号。  
  • –help:显示nm的任选项。

   对于每一个符号,nm列出其值(the symbol value),类型(the symbol type)和其名字(the symbol name)。

   对于每一个符号来说,其类型如果是小写的,则表明该符号是local的;大写则表明该符号是global(external)的。

    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

            

符号

            

类型

            

            

说明

            

            

A

            

            

该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。

            

            

B

            

            

该符号的值出现在非初始化数据段(bss)中。例如,在一个文件中定义全局static int test。则该符号test的类型为b,位于bss section中。其值表示该符号在bss段中的偏移。一般而言,bss段分配于RAM

            

            

C

            

            

该符号为commoncommon symbol是未初始话数据段。该符号没有包含于一个普通section中。只有在链接过程中才进行分配。符号的值表示该符号需要的字节数。例如在一个c文件中,定义int test,并且该符号在别的地方会被引用,则该符号类型即为C。否则其类型为B

            

            

D

            

            

该符号位于初始话数据段中。一般来说,分配到data section中。例如定义全局int baud_table[5] = {9600, 19200, 38400, 57600, 115200},则会分配于初始化数据段中

            

            

G

            

            

该符号也位于初始化数据段中。主要用于small object提高访问small data object的一种方式。

            

            

I

            

            

该符号是对另一个符号的间接引用。

            

            

N

            

            

该符号是一个debugging符号。

            

            

R

            

            

该符号位于只读数据区。例如定义全局const int test[] = {123, 123};test就是一个只读数据区的符号。注意在cygwin下如果使用gcc直接编译成MZ格式时,源文件中的test对应_test,并且其符号类型为D,即初始化数据段中。但是如果使用m6812-elf-gcc这样的交叉编译工具,源文件中的test对应目标文件的test,即没有添加下划线,并且其符号类型为R。一般而言,位于rodata section。值得注意的是,如果在一个函数中定义const char *test = “abc”, const char test_int = 3。使用nm都不会得到符号信息,但是字符串“abc”分配于只读存储器中,testrodata section中,大小为4

            

            

S

            

            

符号位于非初始化数据区,用于small object

            

            

T

            

            

该符号位于代码区text section

            

            

U

            

            

该符号在当前文件中是未定义的,即该符号的定义在别的文件中。例如,当前文件调用另一个文件中定义的函数,在这个被调用的函数在当前就是未定义的;但是在定义它的文件中类型是T。但是对于全局变量来说,在定义它的文件中,其符号类型为C,在使用它的文件中,其类型为U

            

            

V

            

            

该符号是一个weak object

            

            

W

            

            

The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.

            

            

-

            

            

该符号是a.out格式文件中的stabs symbol

            

            

?

            

            

该符号类型没有定义

            

objdump基本用法


  
objdump有点象那个快速查看之流的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。对于一般只想让自己程序跑起来的程序
员,这个命令没有更多意义,对于想进一步了解系统的程序员,应该掌握这种工具,至少你可以自己写写shellcode了,或者看看人家给的exploit
中的shellcode是什么东西。更多关于目标文件的内容分析建议看看《深入理解计算机》这本书的第二部分第七章节
常用法:

objdump [-a│--archive-headers]
[-b bfdname│--target=bfdname]
[-C│--demangle[=style] ]
[-d│--disassemble]

[-D│--disassemble-all]
[-z│--disassemble-zeroes]
[-EB│-EL│--endian={big │ little }]
[-f│--file-headers]
[--file-start-context]
[-g│--debugging]
[-e│--debugging-tags]
[-h│--section-headers│--headers]
[-i│--info]

[-j section│--section=section]
[-l│--line-numbers]
[-S│--source]
[-m machine│--architecture=machine]
[-M options│--disassembler-options=options]
[-p│--private-headers]
[-r│--reloc]
[-R│--dynamic-reloc]
[-s│--full-contents]

[-W│--dwarf]
[-G│--stabs]
[-t│--syms]
[-T│--dynamic-syms]
[-x│--all-headers]
[-w│--wide]
[--start-address=address]
[--stop-address=address]
[--prefix-addresses]

[--[no-]show-raw-insn]
[--adjust-vma=offset]
[--special-syms]
[-V│--version]
[-H│--help]
objfile…
选项详解:
–archive-headers
-a 显示档案库的成员信息,与 ar tv 类似

objdump -a libpcap.a
和 ar -tv libpcap.a 显示结果比较比较
显然这个选项没有什么意思。

–adjust-vma=offset
When  dumping  information, first add offset to all
the section addresses.  This is useful if the  sec-

tion  addresses  do  not correspond  to the symbol
table, which can happen when  putting  sections  at
particular  addresses when using a format which can
not represent section addresses, such as a.out.

-b bfdname
–target=bfdname
指定目标码格式。这不是必须的,objdump能自动识别许多格式,
比如:objdump -b oasys -m vax -h fu.o
显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys
编译器生成的目标文件。objdump -i将给出这里可以指定的
目标码格式列表

–demangle

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

–debugging 
显示调试信息。企图解析保存在文件中的调试信息并以C语言
的语法显示出来。仅仅支持某些类型的调试信息。

–disassemble
-d 反汇编那些含有指令机器码的section

–disassemble-all
-D 与 -d 类似,但反汇编所有section

–prefix-addresses
反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。
显示效果并不理想,但可能会用到其中的某些显示,自己可以对比。

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

-EB
-EL
–endian={big|little}
这个选项将影响反汇编出来的指令。
little-endian就是我们当年在dos下玩汇编的时候常说的高位在高地址,
x86都是这种。

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

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

–help 简短的帮助信息。

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

–section=name

-j name 仅仅显示指定section的信息

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

–architecture=machine
-m machine
指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述

架构信息的时候(比如S-records),这个选项很有用。可以用-i选项
列出这里能够指定的架构

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

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

–full-contents
-s 显示指定section的完整内容。

objdump –section=.text -s inet.o | more

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

–show-raw-insn

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

–no-show-raw-insn
反汇编时,不显示汇编指令的机器码,这是指定 –prefix-addresses
选项时的缺省设置。

–stabs
Display the contents of the .stab, .stab.index, and
.stab.excl sections from an ELF file.  This is only

useful  on  systems  (such as Solaris 2.0) in which
.stab debugging symbol-table entries are carried in
an ELF section.  In most other file formats, debug-
ging  symbol-table  entries  are interleaved  with
linkage symbols, and are visible in the –syms output.

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

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

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

–dynamic-syms

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

–version 版本信息

objdump –version

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

objdump -x inet.o

readelf基本用法


readelf 负责显示ELF文件的信息

Usage: readelf <option(s)> elf-file(s)

Display information about the contents of ELF format files
Options are:
-a –all        全部       Equivalent to: -h -l -S -s -r -d -V -A -I
-h –file-header    文件头   Display the ELF file header
-l –program-headers  程序 Display the program headers

–segments          An alias for –program-headers
-S –section-headers  段头 Display the sections’ header
–sections          An alias for –section-headers
-e –headers     全部头      Equivalent to: -h -l -S

-s –syms        符号表      Display the symbol table
–symbols          An alias for –syms
-n –notes        内核注释     Display the core notes (if present)
-r –relocs       重定位     Display the relocations (if present)

-u –unwind            Display the unwind info (if present)
-d –dynamic      动态段     Display the dynamic segment (if present)
-V –version-info  版本    Display the version sections (if present)
-A –arch-specific  CPU构架   Display architecture specific information (if any).

-D –use-dynamic   动态段    Use the dynamic section info when displaying symbols
-x –hex-dump=<number> 显示 段内内容Dump the contents of section <number>
-w[liaprmfFso] or
–debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]
显示DWARF2调试段内容       Display the contents of DWARF2 debug sections

-I –histogram         Display histogram of bucket list lengths
-W –wide        宽行输出      Allow output width to exceed 80 characters
-H –help              Display this information
-v –version           Display the version number of readelf

Usage: readelf <option(s)> elf-file(s)
Display information about the contents of ELF format files
Options are:
-a –all        全部       Equivalent to: -h -l -S -s -r -d -V -A -I
-h –file-header    文件头   Display the ELF file header

-l –program-headers  程序 Display the program headers
–segments          An alias for –program-headers
-S –section-headers  段头 Display the sections’ header
–sections          An alias for –section-headers
-e –headers     全部头      Equivalent to: -h -l -S

-s –syms        符号表      Display the symbol table
–symbols          An alias for –syms
-n –notes        内核注释     Display the core notes (if present)
-r –relocs       重定位     Display the relocations (if present)

-u –unwind            Display the unwind info (if present)
-d –dynamic      动态段     Display the dynamic segment (if present)
-V –version-info  版本    Display the version sections (if present)
-A –arch-specific  CPU构架   Display architecture specific information (if any).

-D –use-dynamic   动态段    Use the dynamic section info when displaying symbols
-x –hex-dump=<number> 显示 段内内容Dump the contents of section <number>
-w[liaprmfFso] or
–debug-dump[=line,=info,=abbrev,=pubnames,=ranges,=macro,=frames,=str,=loc]
显示DWARF2调试段内容       Display the contents of DWARF2 debug sections

-I –histogram         Display histogram of bucket list lengths
-W –wide        宽行输出      Allow output width to exceed 80 characters


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标文件格式分析工具: ar,nm,objdump,objcopy,readelf 的相关文章

  • 在GDB中,如何在程序停止时自动执行命令? (如显示)

    我希望每次程序停止时自动执行一些命令 就像 display 对 x 所做的那样 我怎么做 这是我发现的简单方法 define hook stop commands to be executed when execution stops en
  • 无法摆脱 GDB 中的“值已被优化掉”

    我正在调试CPython可执行的GDB尽管禁用了所有变量 但仍无法获取某些变量的值GCC优化 gdb print co value has been optimized out gdb frame 0 PyEval EvalFrameDef
  • 是什么让GDB拒绝崩溃?

    我在这里不知所措 我正在用 C 编写一个编译器 出于爱好 并使用 GDB 7 3 在 amd64 Linux 2 6 32 上使用 GCC 4 6 1 进行编译 除了通常的 I 等之外 标志还有 Wall Wextra O0 g 我有一个函
  • 当 std::cerr 上打印某些内容时设置 gdb 断点

    我使用 qt creator 作为 gdb 的 IDE 和前端 当对 std cerr 变量调用operator 如何在 std cerr 设置断点 你的问题没有意义 std cerr是一个全球性的variable 您只能在函数上设置断点
  • GDB - 如何打破“有些东西被写入cout”?

    我想设置一个断点 每次写入内容时都会触发stdout通过cout流 但我无法找到该断点的可能位置 我怎样才能在 gdb 中做到这一点 这是一种依赖于平台的方式 如果您在 x86 64 上并使用 gcc 进行构建 则写入 std cout 会
  • OSX Lion 上的 GDB 7.3.1

    我正在尝试使用 macports 中的 GDB v 7 3 1 来调试用以下命令编译的可执行文件 g 4 7 也来自 macports 但是 我启动调试器 得到以下输出 GNU gdb GDB 7 3 1 版权所有 C 2011 自由软件基
  • gdb print :执行的每个语句的行号

    我有一个确定性的 halting 程序与no IO 我想要使用 gdb 运行并让它打印执行的每个 c 语句 例如文件名 行号
  • 如何判断共享库加载到进程地址空间中的位置?

    我正在尝试调试一个共享库 其中有使用 gdb 的源代码和调试符号 我没有实际使用此共享库的进程的调试符号或代码 我自己编译它 所以我可以拥有一切 但生成的二进制文件被剥离 以模拟我没有代码的情况 该进程打印我正在尝试调试的目标函数 foo
  • 将大核心文件转换为“minicore”文件

    如何将核心文件减少到仅线程堆栈 我希望能够运行 gdbthread apply all bt在迷你核心上 仅此而已 我正在处理大型 gt 4GB 多线程 Linux ELF 核心文件 这些文件太大而无法返回进行分析 我见过谷歌断点器 htt
  • 如何知道gdb附加了哪个进程(stat: T)?

    当 gdb 附加进程时 该进程的 stat 为 T 例如 root 6507 0 0 0 0 67896 952 Ss 12 01 0 00 mytest root 6508 0 0 0 0 156472 7120 Sl 12 01 0 0
  • gdb 输入文件中的十六进制值

    我正在尝试通过使用 gdb 内的 run 我可以成功地溢出程序 但在将十六进制值附加到字符串时遇到问题 我尝试过引用 将 mem addr 的值转换为 ascii 以及各种转义尝试 但没有成功 输入文件示例 AAAA x42 在上面的示例中
  • 如何从 gdb 命令提示符执行外部命令?

    我正在使用 gdb 调试程序 每当我错过断点或决定添加另一个观察点时 我必须终止该进程并重新运行它 为了将现有的 gdb 附加到它 我使用attach
  • 使用 gdb 调试时彻底退出 valgrind

    我正在使用 valgrind 和 gdb 调试程序 然而 我以一种野蛮的方式终止了这些调试会话 这真的是它应该做的吗 设置调试会话 按照来自的指示valgrind 官方网站 http valgrind org docs manual man
  • 分离Gdb而不恢复劣质

    Gdb 与任何其他程序一样 并不完美 我时不时会遇到导致当前 Gdb 实例无法使用的错误 此时 如果我有一个调试会话 其中有很多有价值的状态 我希望能够在其上启动一个新的 Gdb 会话 也就是说 分离 退出 Gdb 并启动一个新的 Gdb
  • 专门逐行调试

    我有一个用 Pascal 编写的脚本 我会以这种方式调试它 在每一行停止 转储内存中所有变量的值 然后转到下一行 是否可以使用 gdb 或其他 Linux 开源工具来完成此操作 使用选项编译文件 g fpc gpc g file pas R
  • 使用 libtool 和 gdb

    我正在开发一个使用 GNU 自动工具的项目 因此为了使用 gdb 调试代码 我从 libtool 中运行 gdb libtool mode execute gdbtui foobar 是否可以重新加载项目的修改版本 而不必退出 gdb li
  • 测试是否定义了 gdb 便利变量

    有没有办法测试 gdb 中是否设置了便利变量 例如 gdb if exitcode 0 gt quit gt end Invalid type combination in equality test gdb p exitcode 1 vo
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort
  • 在GDB中的每一行设置断点

    有没有办法用GDB在代码的每一行设置断点 明明我不想打b addr对于每一行 所以我想知道是否有一种快速的方法来做到这一点 Edit请注意 我正在运行由其他人创建的二进制文件 并且我无权访问源代码 不幸的是 该二进制文件尚未使用 g 标志进

随机推荐

  • c语言实现学生管理系统,C语言学生管理系统源代码

    C语言学生管理系统源代码 由会员分享 可在线阅读 更多相关 C语言学生管理系统源代码 12页珍藏版 请在人人文库网上搜索 1 C语言学生成绩管理系统源代码 保证能用 include malloc h include stdio h incl
  • 【LVGL 学习】LVGL 在 arduino 环境的安装

    1 前提条件 使用 arduino IDE开发 使用 ESP32 作为主控 屏幕使用 ST7789 驱动 240 240像素TFT屏幕 注意 屏幕驱动部分不再这个赘述 以后开贴另行发布 2 安装 LVGL 库 打开 arduino 菜单栏中
  • 【Python】熵值法计算权重

    Python 熵值法计算权重 将分步骤基于python实现熵值法计算权重 代码在pycharm中执行 文章目录 Python 熵值法计算权重 1 引入库 2 读取数据 3 熵值法主体 4 打印出各指标的权重 5 将结果存储至csv文件中 总
  • 数据库 SQL 遍历父子关系表(二叉树)获得所有子节点 所有父节点

    数据库 SQL 遍历父子关系表 二叉树 获得所有子节点 所有父节点 创建表 Create Table A IDInt fatherIDInt NameVarchar 10 Insert A Select 1 NULL tt Union Al
  • 使用Vector模拟实现STL中的stack

    stack 介绍 栈是一种容器适配器 特别为后入先出而设计的一种 LIFO 那种数据被插入 然后再容器末端取出 栈实现了容器适配器 这是用了一个封装了的类作为他的特定容器 提供了一组成员函数去访问他的元素 元素从特定的容器 也就是堆栈的头取
  • python之requests模块详解

    目录 requests使用 requests请求方法 requests响应对象属性 Requests模块是一个用于网络请求的模块 主要用来模拟浏览器发请求 其实类似的模块有很多 比如urllib urllib2 httplib httpli
  • 微信公众号【OpenID详解】

    只知道 openID 是微信号加密后得到的 不同的公众号获取得微信号openID不同 但 UnionID 是一样的 微信openid由用户id和公众号id加密而来 同一用户相对同一公众账号的openid是不变的 对于不同公众号 同一用户的o
  • Learning OpenStack Keystone

    Author 海峰 http weibo com 344736086 http yanheven github io http blog csdn net yanheven1 这周重新学习整理了OpenStack Keystone里面的知识
  • CentOS没有了用什么?Rocky Linux 8.6安装体验

    2020 年 12 月 8 日 CentOS 项目宣布 CentOS 8 将于 2021 年底结束 而 CentOS 7 将在其生命周期结束后停止维护 CentOS 7 9 和 CentOS 8 5 将是最后的2个CentOS 版本 官方解
  • concurrentHashMap解析这篇文章就够了

    实现原理 ConcurrentHashMap使用分段锁技术 将数据分成一段一段的存储 然后给每一段数据配一把锁 当一个线程占用锁访问其中一个段数据的时候 其他段的数据也能被其他线程访问 能够实现真正的并发访问 如下图是ConcurrentH
  • 使用 Python 操作 MongoDB

    使用 Python 操作 MongoDB MongoDB 是一个开源的面向文档的 NoSQL 数据库 它具有高性能 可扩展性和灵活性的特点 通过使用 Python 的 pymongo 模块 我们可以方便地操作 MongoDB 数据库 本文将
  • CPU工作原理和MMU初探

    具体相关内容主要参考自一篇博客 当然有结合其它内容 感谢博主提供的资源 这里附上参考链接 http www cnblogs com xiangtao archive 2013 04 11 3014815 html 关于CPU和MMU需要做几
  • 企业微信第三方应用-应用客服会话(h5)

    企业微信中第三方应用 h5 不能像小程序那样将button标签的open type属性设置为contact即可跳转到客服会话页面 但是js sdk为了开发者提供了openThirdAppServiceChat Api 让用户可快速打开应用客
  • IT项目管理作业五

    一 你联合同学做一个年级微信公众号加强各班相互了解 联合活动 等 请写一份两页的报告 描述收集需求的方法 并附上收集的 需求跟踪矩阵 不少于五个需求 收集需求的方法 数据收集方面 头脑风暴 召集项目所有的参与成员 共同讨论关于微信公众号对于
  • Python Class

    关键字1 self self指代 类的实例化 而不是类本身 class Test def prt self print self print self class t Test t prt result
  • 从事Java三年多,去应聘16k最后没被录用,细节如下……

    前言 今天小编和大家分享一位以前面试的一位应聘者 工作4年26岁 统招本科 以下就是他的简历和面试情况 基本情况 专业技能 1 熟悉Sping了解SpringMVC SpringBoot Mybatis等框架 了解SpringCloud微服
  • 和平精英服务器位置,和平精英音乐盒在哪里 地图详细位置介绍

    和平精英体验服最近重新开放服务器 不少玩家在游戏中发现了新内容 特别是热度特别高的万圣节模式 很多小伙伴会问和平精英音乐盒在哪里 快随小编来看看吧 在所有地图的一些房区里面是会随机刷新出音乐盒的 当我们发现音乐盒后是可以与这个道具互动的 我
  • 2023前端面试题——JS篇

    1 判断 js 类型的方式 1 typeof 可以判断出 string number boolean undefined symbol 但判断 typeof null 时值为 object 判断数组和对象时值均为 object 2 inst
  • 避免陷入信息茧房

    目录 一 什么是信息茧房 二 做什么容易陷入信息茧房 三 如何避免陷入信息茧房 总结 一 什么是信息茧房 信息茧房 Echo Chamber 是指在社交媒体和互联网环境中 个体被限制在一种信息和观点的环境中 与自己持相似观点的人群形成闭环
  • 目标文件格式分析工具: ar,nm,objdump,objcopy,readelf

    http www kgdb info linuxdev object analyse tools 目标文件格式分析工具 ar nm objdump objcopy readelf 2011年9月5日 reship 发表评论 阅读评论 本文转