标签: elf

ELF文件格式中节和段的区别是什么

来自wiki 可执行文件和可链接格式:

这些段包含运行时执行文件所必需的信息,而段包含用于链接和重定位的重要数据.整个文件中的任何字节最多只能由一个部分拥有,并且可能存在不属于任何部分的孤立字节.

但是段和段之间有什么区别?在可执行的ELF文件中,段是否包含一个或多个部分?

linux debian gnu elf abi

60
推荐指数
3
解决办法
2万
查看次数

R_X86_64_32S和R_X86_64_64重定位是什么意思?

当我尝试在64位FreeBSD中编译C应用程序时出现以下错误:

在制作共享对象时不能使用重定位R_X86_64_32S; 用-fPIC重新编译

什么是R_X86_64_32S搬迁,什么是R_X86_64_64

我已经用Google搜索了错误,这可能是原因 - 如果有人能说出R_X86_64_32S的真正意义,那就太好了.

c compiler-construction linker elf relocation

49
推荐指数
3
解决办法
3万
查看次数

arm gcc toolchain as arm-elf or arm-none-eabi,有什么区别?

当你构建一个gcc工具链时,有可能将它构建为arm-elf或arm-none-eabi,但有什么区别?

我今天使用的是eabi,但这只是因为其他人似乎都这样做了......但是因为这是一个非常糟糕的论点,所以理解它们的区别真的很好.

注意:此工具链将交叉编译基于Cortex-M3的mcu代码:如stm32.

谢谢


一些链接:

EABI:

ELF:

gcc arm cortex-m3 elf eabi

48
推荐指数
4
解决办法
5万
查看次数

.bss段零初始化变量是否占用了elf文件中的空间?

如果我理解正确,.bssELF文件中的部分用于为零初始化变量分配空间.我们的工具链生成ELF文件,因此我的问题是:该.bss部分实际上是否必须包含所有这些零?这似乎是一种非常浪费的空间,比如说,当我分配一个全局的10兆字节数组时,它会在ELF文件中产生10兆字节的零.我在这看错了什么?

c++ storage elf segments

44
推荐指数
2
解决办法
3万
查看次数

readelf显示的符号表列的含义是什么?

有人可以解释符号表中显示的列readelf吗?

symbols elf

44
推荐指数
2
解决办法
3万
查看次数

`-rdynamic'究竟做了什么以及何时需要它?

究竟是什么-rdynamic(或--export-dynamic在链接器级别)做什么以及它如何与由-fvisibility*标志或可见性pragmas和__attribute__s 定义的符号可见性相关?

对于--export-dynamic,ld(1)提到:

...如果使用"dlopen"加载需要引用程序定义的符号的动态对象,而不是某些其他动态对象,则在链接程序本身时可能需要使用此选项....

我不确定我完全明白这一点.能否请您提供一个例子,如果没有它可以工作-rdynamic但是没有它?

编辑:我实际上尝试编译了几个虚拟库(单个文件,多个文件,各种-O级别,一些函数间调用,一些隐藏符号,一些可见),有和没有-rdynamic,到目前为止我一直在字节相同的输出(当然保持所有其他标志不变),这是非常令人费解的.

c gcc shared-libraries elf dynamic-loading

38
推荐指数
4
解决办法
2万
查看次数

readelf vs. objdump:为什么两者都需要

我需要了解我正在处理的项目的ELF文件布局,并且我注意到这些工具的存在.为什么所有Linux发行版都包含readelf和objdump?这些工具是否相互补充?我什么时候更愿意使用另一个?

linux elf objdump readelf

37
推荐指数
1
解决办法
1万
查看次数

为什么GCC编译C程序需要.eh_frame部分?

测试在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)

c x86 assembly exception-handling elf

37
推荐指数
1
解决办法
2万
查看次数

如何彻底删除可执行文件

我想尽可能多地剥离 - 在Linux上:一个ELF.我只想在那里运行它需要的东西.

我试过用strip:

strip --strip-all elf
Run Code Online (Sandbox Code Playgroud)

但它似乎没有做得好:nm仍然显示很多东西,二进制文件仍然很大.

我该怎么办?

linux executable gcc strip elf

35
推荐指数
3
解决办法
3万
查看次数

错误/lib/x86_64-linux-gnu/libc.so.6:找不到版本“GLIBC_2.34”

首先,我用谷歌搜索了很多,但没有找到与我的情况相关的东西,我有一个 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)

linux ubuntu glibc elf windows-subsystem-for-linux

35
推荐指数
3
解决办法
20万
查看次数