草庐IT

Riscv-elf

全部标签

linux - ELF 动态加载程序符号查找顺序

解析动态重定位时符号查找的搜索顺序是什么?当解析共享库的符号时,加载程序首先在“主可执行文件”中搜索(让主可执行文件覆盖定义...)还是什么? 最佳答案 据我了解,每个可执行对象都有自己的“查找范围”:主要可执行文件通常是“全局”查找范围中的第一个对象。这意味着在主可执行文件中定义的符号将覆盖依赖共享库中的符号。使用LD_PRELOAD工具添加的共享对象被添加到全局查找范围,就在主可执行文件之后。但是,如果正在加载的共享对象使用DF_SYMBOLIC标志,则源自该对象的符号引用将在全局查找范围内搜索之前在对象内查找定义。使用dlop

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

我必须编写一个C程序来打印ELF文件。我无法确定节标题字符串表的位置。假设我有一个文件,输出如下:阅读-hELFHeader:Magic:7f454c46010101000000000000000000Class:ELF32Data:2'scomplement,littleendianVersion:1(current)OS/ABI:UNIX-SystemVABIVersion:0Type:REL(Relocatablefile)Machine:Intel80386Version:0x1Entrypointaddress:0x0Startofprogramheaders:0(bytes

c - 每个 cpu 架构的真正 ELF TLS ABI 要求是什么?

UlrichDrepper'spaper关于线程本地存储概述了几种不同cpu架构的TLSABI,但我发现它不足以作为实现TLS的基础,原因有两个:它省略了一些重要的架构,如ARM、MIPS等(同时包括了一堆完全不相关的架构,如Itanium)更重要的是,它将很多实现细节与ABI混合在一起,因此很难区分互操作性需要哪些属性,哪些只是他实现的方面。例如,i386唯一实际的ABI要求是:%gs:0指向自身的指针。主可执行文件的TLS段(如果有)必须位于此地址的固定(由链接器确定为负)偏移处。初始加载的库的所有其他TLS段必须有一个运行时常量(即每个线程相同,但在不同的程序运行中不一定相同)相

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

我有一个静态链接到libc的elf二进制文件。我无权访问其C代码。我想使用OpenOnload库,它在用户空间中实现了套接字,因此与标准libc版本相比延迟更低。OpenOnload实现标准套接字api,并使用LD_PRELOAD覆盖libc版本。但是,由于这个elf二进制文件是静态链接的,它不能使用套接字API的OpenOnload版本。我相信通过以下步骤将此二进制文件转换为与OpenOnload动态链接是可能的:添加新的程序标题:PT_INTERP、PT_DYNAMIC和PT_LOAD。在PT_DYNAMIC中添加条目以列出与libc的依赖关系。在新的PT_LOAD部分中为所需的l

linux - 手工ELF文件

嘿,我已经手动创建了一个ELF文件,它有两个部分(.text和.shstrtab)和一个加载.text部分的程序头。.text部分非常小,仅包含以下三个指令......#andexitmovl$0,%ebx#firstargument:exitcodemovl$1,%eax#systemcallnumber(sys_exit)int$0x80#callkernel当我在这个elf文件上运行时,readelf没有报错。如果我执行这个文件,那么一旦我执行它,它就会被杀死并且屏幕上会出现“Killed”消息。我在stackoverflow浏览了以下帖子我还在经历它。现在我担心的是这个程序不要

c - 获取 ELF 二进制文件的加载地址,dlopen 未按预期工作

我正在尝试获取ELF二进制文件的加载地址,butdlopendoesn't按预期工作:void*elf=(char*)dlopen(0,RTLD_NOW);printf("%p\n",elf);sleep(100);它打印0xb772d918,但是从/proc/1510/maps告诉我们,它没有指向dlfn的加载地址>二进制,但是ld-2.15.so,08048000-08049000r-xp00000000fc:001379/root/dlfn08049000-0804a000r--p00000000fc:001379/root/dlfn0804a000-0804b000rw-p00

linux - 使用 Linux 头文件中的 unistd.h 构建不带 libc 的静态 ELF

我有兴趣使用Linux头文件提供的unistd.h构建一个没有(g)libc的静态ELF程序。我已经阅读了这些文章/问题,这些文章/问题大致了解了我正在尝试做的事情,但并不完全是:http://www.muppetlabs.com/~breadbox/software/tiny/teensy.htmlCompilingwithoutlibchttps://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free我有只依赖于unistd.h的基本代码,其中,我的理解是这些函数中的每一个都是由内核提供的,不需要libc。这是我选择的最有前途

c - 相同(几乎)的 ELF header ,但可执行文件不会在彼此的系统上运行

我正在尝试为我拥有的小型嵌入式设备编译几个程序。它是一个Little-endianMIPS(mipsel)处理器。我通过telnet和内置的ftp客户端从中检索了这个可执行文件:root@debian-mipsel:/home/user/wansview/devel#readelf-hunzip1ELFHeader:Magic:7f454c46010101000000000000000000Class:ELF32Data:2'scomplement,littleendianVersion:1(current)OS/ABI:UNIX-SystemVABIVersion:0Type:EXE

c - 读取 ELF 部分的内容(以编程方式)

我正在尝试检索ELF二进制文件中附加部分的内容。此时,我正在使用以下代码来检索每个部分的名称:#include#include#include#include#pragmapack(push,1)#pragmapack(pop)#defineEI_NIDENT16/*32-bitELFbasetypes.*/typedefunsignedintElf32_Addr;typedefunsignedshortElf32_Half;typedefunsignedintElf32_Off;typedefsignedintElf32_Sword;typedefunsignedintElf32_W

c - elf .rel.text 部分 R_386_32/R_386_PC32 的含义

为了理解重定位的概念,我编写了一个简单的chk.c程序如下:1#include2main(){3intx,y,sum;4x=3;5y=4;6sum=x+y;7printf("sum=%d\n",sum);8}它的等效汇编代码,使用“objdump-dchk.o”是:00000000:0:55push%ebp1:89e5mov%esp,%ebp3:83e4f0and$0xfffffff0,%esp6:83ec20sub$0x20,%esp9:c744241c030000movl$0x3,0x1c(%esp)10:0011:c7442418040000movl$0x4,0x18(%esp)