首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在C可执行的elf文件中从函数或全局变量的名称中获取其地址?

在C可执行的elf文件中,可以通过使用符号表来获取函数或全局变量的地址。符号表是elf文件中的一种数据结构,它记录了程序中定义和引用的符号(如函数名、全局变量名)以及它们对应的地址。

要在C可执行的elf文件中获取函数或全局变量的地址,可以按照以下步骤进行:

  1. 使用工具如readelf、objdump等查看elf文件的符号表。这些工具可以提供elf文件的详细信息,包括符号表的内容。
  2. 在符号表中查找目标函数或全局变量的名称。符号表中的每个条目都包含符号的名称、类型和地址等信息。
  3. 获取目标函数或全局变量的地址。根据符号表中的地址信息,可以得到目标函数或全局变量在内存中的地址。

需要注意的是,获取函数或全局变量的地址可能需要对elf文件进行解析和处理,这需要一定的编程知识和技巧。在实际开发中,可以使用一些开源的工具或库来辅助完成这个任务,如libelf、libdwarf等。

对于C可执行的elf文件中获取函数或全局变量地址的应用场景,常见的情况包括动态链接、调试、反汇编等。在动态链接中,需要获取函数或全局变量的地址以进行符号解析和链接;在调试过程中,可以通过获取函数或全局变量的地址来进行断点设置和变量监视;在反汇编中,可以通过获取函数的地址来进行代码分析和逆向工程。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体产品选择应根据实际需求和情况进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《程序员自我修养》第三章学习笔记

结构上说,是编译后可执行文件,只不过还没有经过链接 3.1 目标文件格式 1,可执行文件格式: Windows下PE  和   Linux下ELF 2,广义上说,目标文件可执行文件格式几乎是一样...3,在链接,目标文件之间相互拼合实际上是目标文件之间对地址引用,即对函数和变量地址引用。...对于变量函数来说,符号值就是它们地址。 8,  符号分类: (1)和(2)比较需要关注 (1)       定义在本目标文件全局符号,可被其他目标文件引用。...2,c++符号修饰 (1)       函数签名:包含了一个函数信息(函数名、参数类型、所在类和名称空间和其他信息)。函数签名用于识别不同函数。...3.5.4 extern”C” 1,c++为了与c兼容,在符号管理上,c++有一个用来声明定义一个C符号extern”C关键字用法。 2,可以让c++名称修饰机制不作用。

1.1K60

扒一扒ELF文件

编译和链接角度看ELF文件 ELF头   每个ELF文件都必须存在一个ELF_He ader,这里存放了很多重要信息用来描述整个文件组织,: 版本信息,入口信息,偏移信息等。...编译和链接角度看ELF文件 .symtab section   符号表,它存放在程序定义和引用函数全局变量信息。....bss节应占0x0c大小,但只有装入内存时才会分配。 4.2 程序执行角度看ELF文件可执行文件) ?...段头表能够描述可执行文件节与虚拟空间中存储段之间映射关系。一个表项32B,说明虚拟地址空间中一个连续片段一个特殊节。...编译链接角度看,可重定位目标文件包含ELF头、各个节以及节头表。可执行目标文件包含ELF头、程序头表(段头表)以及各种节组成段。

67920

程序组成、存储与运行

(1) 编译, MDK 软件使用编译器是 armcc 和 armasm,它们根据每个 c/c++和汇编源文件编译成对应以“.o”为后缀名对象文件(Object Code,也称目标文件),其内容主要是文件编译得到机器码...系统使用链接器直接生成可执行映像文件 elf后,内核根据该文件信息加载后,就可以运行程序了,但在单片机平台上,需要把该文件内容加载到芯片上,所以还需要对链接器生成 elf 映像文件利用格式转换器...0 值全局变量; 4) ZI-data: 0 数据段,存放未初始化全局变量及初始化为 0 变量; 编译完工程会生成一个. map 文件,该文件说明了各个函数占用尺寸和地址,在文件最后几行也说明了上面几个字段关系...STM32 在上电启动之后默认 Flash 启动,启动之后会将 RW 段 RW-data(初始化全局变量)搬运到 RAM ,但不会搬运 RO 段,即 CPU 执行代码 Flash 读取,...sensor_value 存放在 ZI 段,系统启动后会自动初始化成零(由用户程序编译器提供一些库函数初始化成零)。

1.3K31

零手写操作系统之RVOS内存管理模块简单实现-02

/静态变量 动态管理内存 - 堆(heap) ---- 内存映射表(Memory Map) 可执行文件各个段在虚拟内存地址,在链接阶段确定,然后程序装载阶段,就按照各个段在链接阶段设置好虚拟地址进行装载...比如Intel IA32下普通可执行ELF文件链接脚本文件elf_i386.x; IA32下共享库链接脚本文件elf_i386.xs等。...参考课程02节mem.s文件 注意: 在C代码中直接获取链接器脚本定义符号是有一定限制C语言是一种静态编译语言,在编译时会将源代码转换为机器码,并生成可执行文件。...C编译器只能根据给定C代码进行编译,将代码转换为机器码,并生成符号表。符号表包含了在C代码定义全局变量函数等符号及其对应地址。...注意: 此处出现printf函数是在02小节编写printf.c文件中出现,而非c语言提供函数,最终输出底层还是借助上一节编写uart.c代码,借助串口输出到连接设备屏幕上。

17540

浅析C++内存布局

C++程序在内存布局是怎样?总结下C++内存布局相关知识。 概述 简单总结下C++变量在内存布局和可执行文件相关知识。暂未涉及虚函数,虚函数表,类继承和多态等C++对象内存模型。...(注意:初始化为0全局变量还是被保存在BSS段),static声明变量也存储在数据段。 .bss bss段存储没有初值全局变量默认为0全局变量,属于静态内存分配。 ...加载可执行目标文件 ELF头标书文件整体格式还包含程序入口点(程序需要运行时执行第一条指令地址)。可执行文件连续片(chunk)被映射到连续内存段。 当在shell输入....将可执行程序代码和数据磁盘复制到内存,在程序头部表引导下加载器将可执行文件片(chunk)复制到代码段和数据段,跳转到程序第一条指令入口点来运行。...文件可执行文件过程 - 简书 可执行程序生成过程 - 故事, - 博客园 liangkangnan博客 从零开始写RISC-V处理器 | liangkangnan博客 「OS」浅析代码到可执行文件过程

1.1K40

程序编译、链接、装载与运行

数量 … header我们可以得到很多有用信息,其中一个尤其重要,那就是段表位置和长度,通过这一信息我们可以ELF文件获取到段表(Section Hedaer Table),在ELF...这是因为b.c变量shared和函数swap都已经明确知道了其地址,所以不需要重定位。...而a.c则不一样,因为在a.c变量shared和函数swap都没有定义在当前文件,因此编译后产生目标文件不存在它们地址信息,所以编译器需要把它们放在重定位表,等到链接时再到其它目标文件中找到对应符号信息之后对其进行重定位...把当前指令下一条指令地址压入栈 跳转到函数体执行 当一个函数被调用完毕之后,esp减小到上面的步骤2数据位置,pop该指令地址,jmp到该指令继续执行。...(寄存器内存) 系统调用返回,将控制权重新交给用户程序 用户程序指定区域获取系统调用结果,系统调用结束 用户写C语言时并不会手动调用系统调用,它们一般都被封装在库函数

1.3K10

认识目标文件结构

前四个字节7f、45、4c、46分别对应ASCII字符Del(删除)、字母E、L、F。这四个字节被称为ELF文件魔数,操作系统在加载可执行文件时会确认魔数是否正确,如果不正确则拒绝加载。...6.未初始化数据段(.bss) .bss段存放是未初始化全局变量与局部静态变量, test.c 未初始化全局变量 int gUninitVar 与局部静态变量 static int staVar1...每个函数和变量都有自己独一名字,才能避免链接过程不同变量和函数之间混淆。在链接,我们将函数和变量统称为符号(Symbol),函数变量名就是符号名(Symbol Name)。...比如 test.o 全局未初始化变量 gUninitVar; (c)在可执行文件,st_value 表示符号虚拟地址,这个虚拟地址对动态链接器十分有用。...一般字符串表在ELF文件也以段形式保存,常见段名为“.strtab”“.shstrtab”。

1.1K30

Shell命令(readelf)

先来看看什么是ELF格式文件: ? 在LinuxELF是标准可执行文件格式,其全称是Executable and Linkable Format。...换句话说: 可执行文件(Executable) 可重定位文件(Linkable) 他们都属于ELF格式文件。...-S 选项列出来信息,有一项是Addr,这是程序运行时对应虚拟地址,可以用这个选项查看可执行文件和可重定位文件区别,你会发现重定位文件全局变量函数等符号地址都是0,这也验证了这些符号需要链接定位编译原理...Data 表示文件数据是按照什么格式组织(大端小端),不同处理器平台数据组织格式可能就不同,x86平台为小端存储格式。...所谓符号,就是程序中使用到所有的函数名和全局变量名,由于函数全局变量默认都是全局可见,因此他们简称全局符号或者符号。全局符号都是需要重定位

1.1K20

完全剖析 - Linux虚拟内存空间管理

数据段:用于存放已经初始化全局变量静态变量段。如在 C 语言中,使用语句 int global = 10; 定义全局变量。 未初始化数据段:用于存放未初始化全局变量静态变量段。...如在 C 语言中,使用语句 int global; 定义全局变量。 堆:用于存放使用 malloc 函数申请内存。 mmap区:用于存放使用 mmap 函数映射内存区。...在 Linux 系统,就是使用这种文件格式来存储一个可执行应用程序。...上面的代码主要完成以下几个工作: ELF信息获取到程序头表大小。 调用 kmalloc 函数申请一块内存来保存程序头表。...调用 kernel_read 函数 ELF 文件读取程序头表数据,保存到 elf_phdata 变量,程序头表偏移量可以通过 ELF e_phoff 字段获取。

3.1K12

链接加载原理及ELF文件格式

链接和加载(linker and loader): linker即链接器,它负责将多个.c编译生成.o文件,链接成一个可执行文件或者是库文件;loader即加载器,它原本功能很单一只是将可执行文件段拷贝到编译确定内存地址即可...符号表作用就是一个助记符,用一个字符串来标示某些抽象地址,它能标示地址有代码地址和数据地址,代码地址包括函数名、跳转标号,数据地址包括全局变量。...符号表组织如下图所示: 以上描述可以看出,符号表作用就是将符号名称地址进行绑定。...重定位表(Relocation): 有了符号表,就需要有人对符号表进行引用,在程序执行过程全局变量引用、跳转、调用函数,这些都涉及到相应符号引用。...c.objdump “objdump –d file“反汇编出elf文件包含可执行代码section,elf命令功能最强大一个。

1.1K20

ELF文件结构描述

在链接,目标文件之间相互拼合实际上是目标文件之间对地址引用,即对函数和变量地址引用。...每个函数变量都有自己独特名字,才能避免链接过程不同变量和函数之间混淆。在链接,我们将函数和变量统称为符号(Symbol),函数变量名就是符号名(Symbol Name)。...比如有个用汇编语言编写库定义了一个函数叫做main,那么我们在C语言里面就不可以定义一个main函数变量了。...同样道理,如果一个C语言目标文件要用到一个使用Fortran语言编写目标文件,我们也必须防止它们名称冲突。...为了防止类似的符号名冲突,UNIXC语言就规定,C语言源代码文件所有全局变量函数经过编译后,相对应符号名加上“”。

1.5K50

SCA技术进阶系列(三):浅谈二进制SCA在数字供应链安全体系应用

当然二进制成分分析也存在一些技术挑战:无法准确地确定程序变量和函数名。分析过程可能会因为一些代码混淆和程序加固技术而变得困难无法进行。...;汇编: 使用汇编器as将汇编代码汇编成二进制.o文件 (又称目标文件);链接:最后使用链接器ld将目标文件和目标文件中用到一些库文件进行链接生成Linux下elf格式可执行文件a.out,这个可执行文件才可以在...一个ELF二进制文件通常包括以下几个部分:.data:已经初始化全局变量/局部静态变量;.bss:未初始化全局变量/局部静态变量;.got.plt:全局偏移量表,保存全局变量引用地址;.rodata...:只读数据;.text:代码节,保存了程序执行代码二进制指令;.init:程序初始化和终止代码;Header:包含程序基本信息,入口地址、代码段起始地址、数据段起始地址等。...当运行可执行文件时,OS会fork一个进程,execve把可执行文件加载到进程用户态内存,然后内核返回,再跳转到ELF文件入口地址_start,调用main()函数,进入代码段。

56730

变量究竟存储在什么地方?

可执行目标文件:包含二进制代码和数据,其形式可以被直接拷贝到存储器并执行 3....pintf和switch语句中字符串和常量值 .data 已初始化全局变量 .bss 未初始化全局变量 .symtab 符号表,存放在程序中被定义和引用函数全局变量信息 .rel.text...由该文件定义并能被其他模块引用全局符号。即非静态C函数和非静态全局变量程序a,z,swap。 2. 由其他模块定义并被该文件引用全局符号。用extern关键字所定义变量和函数。...只被该文件定义和引用本地符号。用static关键字定义函数和变量。程序b和c。 该程序所对应符号表如图所示: ?...可重定位目标文件:距定义目标文件起始位置偏移 可执行目标文件:一个绝对运行地址 Size 目标的大小 Type 要么是数据,要么是函数各个节表目 Bind 符号是全局还是本地

1.7K10

Linux可执行文件与进程虚拟地址空间

一个可执行文件包含可被CPU执行指令和待处理数据,上CPU之前,指令和数据全部被翻译成成二进制形式。在可执行文件内部,划分出了一些专门段,代码段,数据段,BSS段等。...代码段存放可执行二进制指令,数据段存放初始化过变量,BSS段存放未初始化变量,装载角度,把这些段称为segment。 32位虚拟地址空间 ? 64位虚拟地址空间 ?...所以在将目标文件链接成可执行文件时候,链接器会尽量把相同相似权限属性section分配在同一空间,在程序头表,将一个多个属性类似的section合并为一个segment,然后在装载时候,将这个...ELF可执行文件与进程虚拟地址空间映射关系 ? 很明显,属性相同相似的section会被归类到一个segment,并且被映射到同一个VMA。 ?...在C语言中,没有初始化全局变量和一些静态变量会被默认初始化为0 ,这就是原因,因为它们会被分配到BSS段上,被一次性初始化为0。

4.2K30

动态链接步骤与实现

从这一步开始,动态链接器代码才可以使用自己全局变量和静态变量。 实际上在动态链接器自举代码,除了不可以使用全局变量和静态变量之外,甚至不能调用函数,即动态链接器本身函数也不能调用。...然后链接器开始寻找可执文件所依赖共享对象,我们前面提到过“.dynamic”段,有一种类型入口DT_NEEDED,它所指出是该可执行文件(共享对象)所依赖共享对象。...然后链接器开始集合里取个所需要共享对象名字,找到相应文件后打开该文件,读取相应ELF文件头和“ .dynamic”段,然后将它相应代码段和数据段映射到进程空间中。...内核在装载完ELF可执行文件以后就返回到用户空间,将控制权交给程序入口。对于不同链接形式ELF可执行文件,这个程序入口是有区别的。...对于静态链接可执行文件来说,程序入口就是ELF文件头里面的 e_entry指定入口;对于动态链接可执行文件来说,如果这时候把控制权交给e_entry指定入口地址,那么肯定是不行,因为可执行文件所依赖共享库还没有被装载

1.3K20

CSAPP---第七章-链接

c变量在运行时被保存在栈 .bss: 存放未初始化全局和静态c变量,以及所有被初始化为0全局静态变量。...c函数全局变量 被模块m定义和引用局部符号,它们对应于带static属性c函数全局变量。...下图展示了ELF重定位条目格式: ELF定义了32种不同重定位类型,我们只需要关心其中两种即可: 重定位PC相对引用 重定位绝对引用 链接器会根据我们目标文件或者静态库重定位表,找到那些需要被修正全局变量函数...任何 Linux 程序都可以通过调用 execve 函数来调用加载器。加载器将可执行目标文件代码和数据磁盘复制到内存,然后通过跳转到程序第一条指令入口点来运行该程序。...JNI 基本思想是将本地 C 函数 foo)编译到一个共享库 foo.so)。

83310

程序员角度看ELF

ELF可执行文件,他们入口点都是 _start,   然后由 _start 函数调用 _init 执行相关 .init 节初始化代码!...(这里针对ELF可执行文件,对于共享库.init段,还是由interpreter来调用!!!...crtend.o.init代码含有对__do_global_ctors_aux()调用,这说明C++构造函数是在前面所有.o文件( crti.o、crtbegin.o、test.o以及其他libc.a...其实也可 以理解,因为构造函数位于较高层次,很可能依赖于很多其他元素,libc.a函数,因此先调用这些元素.init代码也合情合理,就像C++构造子类时要先构造其父类一样。   ...crtbegin.o.fini代码含有对__do_global_dtors_aux()调用,这说明C++析构函数是在后面所有.o文件( test.o、libc.a*.o、crtend.o、crtn.o

95040

【图片+代码】:GCC 链接过程【重定位】过程分析

示例代码 示例代码很简单,一共有2个源文件main.c和 sub.c。 在sub.c定义了一个全局变量和一个全局函数,然后在main.c中使用这个全局变量和全局函数。...很久之前总结过这篇文章:《Linux系统编译、链接基石-ELF文件:扒开它层层外衣,字节码粒度来探索》,里面详细总结了ELF文件内部结构,以及一些相关工具。...:readelf -s sub.o): 关注上图中黄色矩形两个符号:SubData和SubFunc,很明显它们就是sub.c定义两个符号:全局变量和全局函数。...示例代码(.c文件)可知:main函数在调用sub.cSubFunc函数时,传入了变量SubData。...再来看一下可执行文件main反汇编代码: 黄色和红色矩形框可以看出,二进制指令地址值与上面的分析是一致

60910

万字图文 | 你写代码是如何跑起来

我们这次再借助 nm 命令来进一步查看一下可执行文件符号及其地址信息。-n 选项作用是显示符号以地址排序,而不是名称排序。...在 Linux 每一个加载器都用一个 linux_binfmt 结构来表示。其中规定了加载二进制可执行文件 load_binary 函数指针,以及加载崩溃文件 core_dump 函数等。...也就是说默认给栈申请了 4KB 大小。最后把栈指针记录到 bprm->p 。 另外再看下 prepare_binprm,在这个函数文件头部读取了 128 字节。...)elf_phdata, size); ... } 4.3 清空父进程继承来资源 在 fork 系统调用创建出来进程,包含了不少原进程信息,地址空间,信号表等等。...这个参数有这么几种可能 值为 0,就是直接按照 ELF 文件地址在内存中进行映射 值为对齐到整数页开始,物理文件可能为了可执行文件大小足够紧凑,而不考虑对齐问题。

51830
领券