elf相关内容
我有一个我想调试的ELF 32位动态链接,剥离文件。尝试在地址处设置断点时,会显示一条消息,指出符号表未加载。 我的问题是: 当你说ELF文件是剥离究竟发生了什么? 您是否剥离了ELF文件? 是否有可能以某种方式重建符号表? 是否可以在gdb中设置断点剥离可执行文件? 解决方案 剥离ELFs是用gnu binutils工具条完成的, strip man page:
..
[ks @ localhost〜] $ gdb我可以调试一些程序(比如/ bin / ls) -q --args / bin / ls 从/bin/ls../中读取符号/从/bin/ls...读取符号(找不到调试符号)...完成。 (找不到调试符号)...完成。 缺少单独的debuginfos,请使用:debuginfo-install coreutils-8.22-19.fc21.x86
..
在这个问题上我找不到答案。 使用GDB,我可以使用“call”命令来获取函数的原型。 示例: (gdb)call fn $ 1 = {void(int,int)} 0x8048414 < FN> 因此,GDB只能从elf-file中找出fn()返回void然后以两个整数作为参数。 但是,我需要使用其他工具从elf文件中提取函数原型。最好,我想
..
通过GDB源代码进行挖掘,我可以在哪里找到有关用于创建核心文件的格式的文档? ELF 规范保留了核心文件格式,所以我想这应该是GDB规范的一部分!可悲的是,我从GNU的gdb文档中找不到这方面的任何帮助。 这是我想要做的:将虚拟地址映射到可执行文件/库中的函数名包括运行过程。为此,我首先想从核心文件中找出映射从虚拟地址空间到可执行文件/库的名称,然后挖掘相关文件以获取符号信息。 现在'
..
继我的手动生成核心转储文件的问题后,我决定跳水我能够构建基本的核心转储结构,并将我的死程序的内存返回到大型LOAD部分的核心转储中。在GDB中调试时,我的变量回来了,没有问题。 这里有棘手的部分,我该如何让GDB检索程序在崩溃时的位置信息。 我知道,核心转储包含这些信息(cpu寄存器等)。这是一个 objdump -h 给出的“真正的”核心转储: core.28339 :文件格式e
..
我正在寻找手动生成一个ELF核心转储文件。 我的程序有一个RAM转储,也可以检索寄存器信息等等。 / p> 有了这些数据,我想要构建一个ELF核心转储文件,类似于当程序崩溃时由Linux内核生成的转储文件,目标是分析此核心转储我一直在寻找核心转储规格或详细格式,但没有找到我想要的: $ b 我的核心转储文件需要哪些部分? 它们如何组织到ELF容器中? $ b 如何从
..
这个问题确实很棒解释如何获得一个精灵文件的符号(变量,函数等)。 现在我已经知道他们在哪个位置(模块)的符号。例如,如果我编译一个由文件 main.c 和组成的程序, someFile.h 和 someFile.c 。我们还可以说 main.c 程序包含全局变量 int Counter。,那么我怎样才能知道变量 Counter 位于main.c中? 解决方案 答案位于此处。 。
..
我对ELF文件中的未初始化全局变量的位置感到有点困惑。我有这个简单的程序来测试变量将在哪些部分: const int a = 11; int b = 10; int c; int main() { return 0; } 我知道未初始化的全局变量应该放入ELF文件的.bss段,但objdump -h给了我以下输出: 部分: Idx名称大小VM
..
我有一个关于ELF动态符号表的问题。对于类型为FUNC的符号,我注意到某些二进制文件中的值为0。但在其他二进制文件中,它有一些非零值。这两个二进制文件都是由gcc生成的,我想知道为什么这个区别?是否有任何编译器选项来控制它? 编辑:这是readelf的输出--dyn -syms prog1 符号表'.dynsym'包含5个条目: 编号:值大小类型绑定Vis Ndx名称 0:00000
..
我在网上研究了很多关于ELF文件的知识,但是我找不到我想要的东西。我正在Linux OS上编写C和C ++代码,并使用gcc和Kate程序。完成我的代码后,我想生成ELF可执行文件。我只能生成“a.out”文件,我不需要它。我如何获得ELF文件? ELF文件是由什么发生的?或者是否有可能用这个程序生成这个文件? 解决方案 编译器(即 gcc code>或 g ++ )将调用产生ELF可执行
..
我在x86_64机器上使用gcc 4.8.2版(Debian 4.8.2-21)在Debian 7系统上静态编译一个非常简单的hello-world单行程: gcc test.c -static -o test 和我得到一个可执行的ELF文件,其中包括以下部分: [17] .tdata PROGBITS 00000000006b4000 000b4000 00
..
如果我创建一个没有SONAME的共享库就像这样 $ b $ gcc -shared libfoo.o -o libfoo.so 并链接到它, 链接器如何找到我的共享库? 是否链接器将文件名 libfoo.so 视为默认的SONAME? 解决方案 我认为你是对的。这里是什么ld手册页说: -soname = name 创建一个E
..
我知道两者之间的关系: lockquote 虚拟地址 mod 页面对齐==文件偏移量 mod 页面对齐 但是有人可以告诉我这两个数字在哪个方向上计算出来吗? 是否根据上述关系计算出文件偏移的虚拟地址,反之亦然? 更新 h2> 这里有一些细节:当链接器写入ELF文件头时,它设置程序头文件的虚拟地址和文件偏移量(段) 例如,输出 readelf -l someEL
..
有没有办法在linux中设置GCC编译C程序中的堆起始地址?在x86_64系统中,我的测试程序将堆地址设置为4字节的引用地址(小于FFFFFFFF)。我想将它设置为8字节的引用地址进行一些测试(> FFFFFFFF)。 GCC是否提供了设置堆起始地址的方法? 解决方案 您可以使用 sbrk() #include #include #
..
我是编译器的初学者,但我非常有兴趣了解程序是如何构造的(二进制)以及如何读取和加载到内存中以供执行。你们建议我阅读哪些电子书/书籍/教程以便快速入门? 解决方案 编译器和可执行文件是远程相关的。 (实际的可执行文件是由连接器 ld 编译的,而不是编译器)。 在Linux系统上, a href =“http://en.wikipedia.org/wiki/Linux_kernel”rel =
..
我刚刚阅读了 init和fini部分在ELF文件中,并给它一个尝试: #include int main(){ puts(“main”); 返回0; } void init(){ puts(“init”); } void fini(){ puts(“fini”); $ / code> 如果我做 gcc -Wl,-init,
..
将c(或asm)中的hello-world-like程序与 gcc 链接时,它会在结果可执行文件中添加一些内容。我只知道运行时动态链接器和 _start 入口点,但是这些添加的函数是什么类型的? 00000000004003f0 t deregister_tm_clones 0000000000400430 t register_tm_clones 0000000000400470
..
我想用 .interp 段来编译共享库。 #include $ b $ int foo(int argc,char ** argv){ printf(“Hello,world!\\\ ”); 返回0; } 我正在使用以下命令。 gcc -c -o test.o test.c ld --dynamic-linker = b
..
在解析动态重定位时,符号查找的搜索顺序是什么? 解析共享库的符号时,加载器首先搜索'main executable'让主要的可执行文件覆盖定义...)或什么?根据我的理解,每个可执行文件都有自己的“可执行文件”查找范围“: 主要的可执行文件通常是”全局“查找范围中的第一个对象。这意味着主可执行文件中定义的符号会覆盖依赖共享库中的符号。使用 LD_PRELOAD 工具添加的共享对象被添加
..
我最近在Debian Linux下使用gcc编译了一个简单的hello world C程序: gcc -mtune = native - march = native -m32 -s -Wunused -O2 -o hello hello.c 文件大小为2980字节。我在一个十六进制编辑器中打开它,我看到以下几行: GCC:(Debian 4.4.5-8)4.4
..