标签: elf

为什么共享库的ELF头将Linux指定为OSABI?

我的Linux系统上的所有标准共享库(Fedora 9)都将ELFOSABI_NONE(0)指定为OSABI.

这很好 - 但是我收到了供应商的共享库,其中ELF头中给出的OSABI是ELFOSABI_LINUX(3).

这对于用于Linux系统的共享库来说听起来不是一个不合理的值,但是它与我所有其他库的值不同 - 所以当我尝试使用dlopen()从一个库中打开这个库时我的其他库失败,错误"ELF文件操作系统ABI无效".

我编译了FreeBSD实用程序brandelf.c并使用它将OSABI类型更改为0,现在库似乎可以正常运行其他所有内容.

我只是想知道 - 为什么你认为这个库被标记为ELFOSABI_LINUX?我猜它们可能在另一个系统上交叉编译并指定了一些gcc标志,导致这个值被设置到ELF标题中?我试图实现类似的东西,但无法确定适当的gcc标志或标志.

我想知道可能的原因是什么,因为这个特定的供应商在没有大量手持的情况下不会做任何事情,我希望能够说"你可能正在做X但是这意味着我们必须修改你的库在我们收到它们之后".

linux shared-libraries elf abi

8
推荐指数
1
解决办法
3067
查看次数

如何在PE中将PE(可移植可执行文件)格式转换为ELF

将PE二进制文件转换为ELF二进制文件的最佳工具是什么?

以下是此问题的简要动机:

  1. 假设我有一个简单的C程序.
  2. 我使用gcc for linux编译它(这给了ELF),并使用'i586-mingw32msvc-gcc'用于Windows(这给出了一个PE二进制文件).
  3. 我想分析这两个二进制文件的相似之处,使用Bitblaze的静态分析工具 - vine(http://bitblaze.cs.berkeley.edu/vine.html)
  4. 现在藤蔓没有对PE二进制文件的良好支持,所以我想转换PE-> ELF,然后进行我的比较/分析.

由于所有分析都必须在Linux上运行,我更喜欢在Linux上运行的实用程序/工具.

谢谢

linux binary elf portable-executable

8
推荐指数
3
解决办法
8914
查看次数

库初始化后从RAM刷新ELF部分

我在ELF共享库中有很多代码,只在库初始化期间使用它(它是从静态初始化程序调用的).如果我把这段代码放在它自己的部分(或者它可以放在.init部分中),我可以使用__attribute__((section(".mysection"))),有没有办法在库加载后强制将该部分分页?

这个问题是相关的,但结论是内核会在内存不足时分页出未使用的页面,所以没有必要明确地这样做.但是,我正在一个内存非常宝贵的嵌入式环境中工作,而来自磁盘(慢速USB闪存驱动器)的代码分页成本很高.因此,我宁愿显式刷新这段代码,我知道这些代码永远不会被再次使用,而不是内核可能决定刷新其他可能最终需要重新分页的代码.

我确定我记得读过有关系统调用的内容,要求内核进入或退出某些内存区域,虽然我无法在任何地方找到任何引用,所以也许我想象它.这样的事情存在吗?

linux memory-management elf

8
推荐指数
1
解决办法
363
查看次数

如何手动加载和执行ELF二进制可执行文件?

假设二进制文件是PIC,我如何将其加载到内存中并执行入口点?我这样做是为了熟悉ELF所以execve不允许这样做.

c elf

8
推荐指数
1
解决办法
3503
查看次数

ELF动态加载程序符号查找排序

解析动态重定位时符号查找的搜索顺序是什么?

解析共享库的符号时,加载器首先搜索"主可执行文件"(让主可执行文件覆盖定义......)或者什么?

linux gcc elf ld binutils

8
推荐指数
1
解决办法
2273
查看次数

如何找到elf文件的节头字符串表的偏移量?

我必须编写一个打印ELF文件的C程序.我无法弄清楚节头字符串表的位置.

假设我有一个文件,它给了我以下输出:

readelf -h

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              REL (Relocatable file)  
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          0 (bytes into file)
  Start of section headers:          17636 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of …
Run Code Online (Sandbox Code Playgroud)

c linux elf

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

将动态链接的elf二进制文件转换为静态链接

是否可以将动态链接的elf二进制文件转换为静态链接的?

c c++ linux elf

8
推荐指数
1
解决办法
5419
查看次数

全局变量位于elf文件中的哪个位置

我想学习elf文件,但是当我想到全局变量,全局静态变量和范围静态变量时,我有些困惑.例如:

int a = 2;
int b;

static int c = 4;
static int d;

void fun(){
  static int e = 6;
  static int f;
}


int main(void){
   fun();
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉每个变量属于哪个细分?在我看来, b,df属于.bss段和a,c以及e属于数据段,但我不知道全局静态变量和ELF文件的全局变量之间的差异.

c linux elf

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

如何创建向后兼容的动态链接?

似乎glibc 2.14引入了新版本memcpy(修复bug 12518).然后,针对glibc 2.14+编译的程序将包含动态链接memcpy@GLIBC_2.14,这在旧版本的glibc中显然不可用.

但是,glibc 2.14+显然仍然包含旧memcpy@GLIBC_2.2.5符号以实现向后兼容.我希望能够以这样的方式编译一些程序,使它们与旧的glibc版本二进制兼容.如何在具有glibc 2.14+的系统上编译程序,以便它使用这个旧的符号版本?如果该过程必然是特定于编译器的,那么我正在使用GCC(但是知道如何在其他编译器上执行它也会很好).

(在一个侧面说明,我必须承认不知道一大堆有关版本的符号,比如如何产生,以及如何使用它们,或者他们是否是ELF特定的或应被认为是现代的ABI标准的一部分;我还没有找到任何关于它的文件.关于这个问题,有没有很好的信息来源?)

c glibc libc elf binary-compatibility

8
推荐指数
1
解决办法
637
查看次数

无法解决的`R_X86_64_NONE`搬迁

我在CentOS 7上使用Devtoolset-7并且已经构建了Boost 1.65.1 w/it.但是当我链接我的应用程序时,我有以下内容:

/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: /opt/rh/devtoolset-7/root/usr/lib64/libboost_unit_test_framework.a(compiler_log_formatter.o)(.text._ZN5boost9unit_test5utils11string_castINS0_13basic_cstringIKcEEEESsRKT_[_ZN5boost9unit_test5utils11string_castINS0_13basic_cstringIKcEEEESsRKT_]+0x3c): unresolvable R_X86_64_NONE relocation against symbol `_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4'
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

搜索更多信息R_X86_64_NONE并没有给出任何有价值的结果:大多数类似的问题没有任何答案或精确解释这是什么以及如何解决它.

所以我的问题是:

  • 这个错误究竟意味着什么?
  • 是什么R_X86_64_NONE和为什么"没有任何重新定位"(根据bintils来源)ELF标题中存在的符号类型?

附录:

  • 链接单元测试可执行文件时出错,链接到我的静态库和Boosts的静态库(单元测试框架)
  • 所有静态库(Boost和我的一个)都内置了-fPIC选项

PS.我真的希望这个问题能够一次又一次地解决(已经打过几次,但这次更新到最新的binutils并没有帮助).(将对此问题的任何活动开始赏金)

c++ elf unresolved-external binutils

8
推荐指数
1
解决办法
1195
查看次数