来自wiki 可执行文件和可链接格式:
这些段包含运行时执行文件所必需的信息,而段包含用于链接和重定位的重要数据.整个文件中的任何字节最多只能由一个部分拥有,并且可能存在不属于任何部分的孤立字节.
但是段和段之间有什么区别?在可执行的ELF文件中,段是否包含一个或多个部分?
当我尝试在64位FreeBSD中编译C应用程序时出现以下错误:
在制作共享对象时不能使用重定位R_X86_64_32S; 用-fPIC重新编译
什么是R_X86_64_32S搬迁,什么是R_X86_64_64?
我已经用Google搜索了错误,这可能是原因 - 如果有人能说出R_X86_64_32S的真正意义,那就太好了.
当你构建一个gcc工具链时,有可能将它构建为arm-elf或arm-none-eabi,但有什么区别?
我今天使用的是eabi,但这只是因为其他人似乎都这样做了......但是因为这是一个非常糟糕的论点,所以理解它们的区别真的很好.
注意:此工具链将交叉编译基于Cortex-M3的mcu代码:如stm32.
谢谢
一些链接:
EABI:
ELF:
如果我理解正确,.bssELF文件中的部分用于为零初始化变量分配空间.我们的工具链生成ELF文件,因此我的问题是:该.bss部分实际上是否必须包含所有这些零?这似乎是一种非常浪费的空间,比如说,当我分配一个全局的10兆字节数组时,它会在ELF文件中产生10兆字节的零.我在这看错了什么?
究竟是什么-rdynamic(或--export-dynamic在链接器级别)做什么以及它如何与由-fvisibility*标志或可见性pragmas和__attribute__s 定义的符号可见性相关?
对于--export-dynamic,ld(1)提到:
...如果使用"dlopen"加载需要引用程序定义的符号的动态对象,而不是某些其他动态对象,则在链接程序本身时可能需要使用此选项....
我不确定我完全明白这一点.能否请您提供一个例子,如果没有它可以工作-rdynamic但是没有它?
编辑:我实际上尝试编译了几个虚拟库(单个文件,多个文件,各种-O级别,一些函数间调用,一些隐藏符号,一些可见),有和没有-rdynamic,到目前为止我一直在字节相同的输出(当然保持所有其他标志不变),这是非常令人费解的.
我需要了解我正在处理的项目的ELF文件布局,并且我注意到这些工具的存在.为什么所有Linux发行版都包含readelf和objdump?这些工具是否相互补充?我什么时候更愿意使用另一个?
测试在32位x86 Linux和gcc4.6.3上进行
当gcc用于编译C程序并使用readelf检查部分信息时,我可以看到里面的.eh_frame部分和.eh_frame_hdr部分.
例如,这是二进制程序的部分信息Perlbench.
readelf -S perlbench
There are 28 section headers, starting at offset 0x102e48:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 08048154 000154 000013 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 08048168 000168 000020 00 A 0 0 4
[ 3] .note.gnu.build-i …Run Code Online (Sandbox Code Playgroud) 我想尽可能多地剥离 - 在Linux上:一个ELF.我只想在那里运行它需要的东西.
我试过用strip:
strip --strip-all elf
Run Code Online (Sandbox Code Playgroud)
但它似乎没有做得好:nm仍然显示很多东西,二进制文件仍然很大.
我该怎么办?
首先,我用谷歌搜索了很多,但没有找到与我的情况相关的东西,我有一个 ELF 可执行文件,我试图在我的 Ubuntu WSL 中运行它,我已经更改了权限 ( chmod +x file),当我运行它时,这个出现错误
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by myFile)
Run Code Online (Sandbox Code Playgroud)
当我使用 ld 命令时,这会向我显示
myFile(.eh_frame); no .eh_frame_hdr table will be created
Run Code Online (Sandbox Code Playgroud)
当我尝试升级 GLIBC 时,它说它是最新的
Reading package lists... Done
Building dependency tree
Reading state information... Done
libc6 is already the newest version (2.31-0ubuntu9.7).
libc6 set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 215 not upgraded.
Run Code Online (Sandbox Code Playgroud)
然后我尝试从https://packages.ubuntu.com/impish/amd64/libc6/download手动安装 deb 文件,但这对我来说是这样的:
dpkg: regarding libc6_2.34-0ubuntu3.2_amd64.deb containing libc6:amd64:
libc6:amd64 breaks fakeroot …Run Code Online (Sandbox Code Playgroud)