11得票2回答
GCC连接器描述文件:强制符号位于特定地址

我对gcc链接器描述文件有一个非常具体的问题。 我有一个嵌入式项目,必须确保主符号或主符号的地址出现在特定地址(Elf文件)上。 原因是,我有一个微控制器,它有一个引导加载程序。 这个引导加载程序应该在启动后调用主例程。 因此,我必须提供启动后要跳转的地址。 是否可以使用链接器描述文件来强...

20得票5回答
二进制文件(PE/COFF和ELF)格式和术语的澄清

我对这些术语感到有些困惑。 输入链接器的文件称为目标文件,链接器生成的映像文件被加载器用作输入。 这段内容来自于《MS PE & COFF规范》。 问题1:映像文件也称为二进制映像、二进制文件或者只是二进制。对吗? 问题2:根据上述术语,PE/ELF/COFF是映像文件的格式,而不...

111得票7回答
使用GCC的C/C++:将资源文件静态添加到可执行文件或库中

有没有人知道如何使用GCC将任何资源文件静态编译到可执行文件或共享库中? 例如,我想添加永远不会更改的图像文件(如果它们发生变化,我也必须替换文件),并且不希望它们留在文件系统中。 如果这是可能的(我认为这是可能的,因为Windows的Visual C++也可以做到这一点),那么我该如何加载存...

45得票5回答
如何彻底删除可执行文件

我希望尽可能地减少文件大小 - 在Linux上: 一个ELF文件。我只需要里面运行所需的内容。 我尝试使用strip命令:strip --strip-all elf 但是它似乎没有做好: nm 仍然显示很多内容,而且二进制文件仍然很大。我该怎么做?

25得票5回答
如何找出程序或其他库使用的共享对象的哪些函数?

我该如何找到一个程序或另一个库使用的共享对象中的哪些函数? 在这个具体的情况下,我想知道在 /lib/libgcc1_s.so.1 中的哪些函数被另一个动态库使用。 由于它们是动态链接的,objdump -d 无法解析函数调用地址。 除了在调试器中运行程序或静态地重新链接之外,是否有其他方法?...

21得票2回答
ELF文件中的“节到段映射”存储在哪里?

作为尝试从零开始编写编译器的一部分,我目前正在处理处理ELF文件的部分。 经过阅读多篇文章和规范,我仍然不太明白节到段映射存储在哪里。 当观察使用NASM+ld生成的小型可执行文件时,我可以看到.text节被某种方式映射到LOAD类型的程序头上,但是如何实现呢? 给定一个小型(工作)可执行...

8得票1回答
如何钩取特定共享ELF库的函数?

LD_PRELOAD可以钩住整个进程的一些函数,但是我需要通过动态链接库的名称只钩住其中一个特定的函数。

21得票1回答
Symbol visibility,异常,运行时错误

我正在努力更好地理解符号可见性。GCC Wiki(http://gcc.gnu.org/wiki/Visibility)有一节关于“C++异常问题”。据GCC Wiki称,由于未导出异常,可能会出现运行时错误。没有编译时错误/警告的运行时错误非常危险,因此我试图更好地理解这个问题。我进行了一些...

7得票1回答
为什么我的简单`main`程序的ELF头部显示它是一个`DYN(共享对象文件)`,而不是可执行文件?

以下是一个非常简单的C++程序: // main.cpp int main() {} 我的Makefile会生成以下命令来编译程序。 ❯ make g++ -O0 -fverbose-asm -o main main.cpp 我使用命令file来检查它是否为ELF可执行文件: ...

15得票6回答
为什么我的ELF可执行文件中会出现编译器版本信息?

最近我使用gcc在Debian Linux下编译了一个简单的C语言Hello World程序:gcc -mtune=native -march=native -m32 -s -Wunused -O2 -o hello hello.c 文件大小为2980字节。我在十六进制编辑器中打开它,看到以下...