首页
学习
活动
专区
工具
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.2K60

扒一扒ELF文件

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

77920
  • 程序的组成、存储与运行

    (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.4K31

    解锁动静态库的神秘力量2:从代码片段到高效程序的蜕变(续篇)

    ELF⽂件的各种信息和 数据都存储在不同的节中,如代码节存储了可执⾏代码,数据节存储了全局变量和静态数据等。....rodata节 :保存了只读的数据,如⼀⾏C语⾔代码中的字符串。由于.rodata节是只读的,所以只能存在于⼀个可执⾏⽂件的只读段中。...当所有模块组合在一起之后,链接器会根据我们的.o文件或者静态库中的重定位表找到那些需要被重定位的函数全局变量,从而修正它们的地址。这其实就是静态链接的过程 。...实际上,程序的⼊⼝点是 _start ,这是⼀个由C运⾏时库(通常是glibc)或链接器(如ld)提供的特殊函数。在 _start 函数中,会执⾏⼀系列初始化操作,这些操作包括: 1....GOT,表中每⼀项都是本运⾏模块要引⽤的⼀个全局变量或函数的地址。

    8510

    从零手写操作系统之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代码,借助串口输出到连接设备的屏幕上。

    25340

    浅析C++内存布局

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

    1.2K40

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

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

    1.4K10

    认识目标文件结构

    前四个字节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.2K30

    深入浅出GCC编译器

    可以输入 readelf 查看说明及选项参数 readelf -h 显示可执行文件或目标文件的ELF Header的文件头信息(就是ELF文件开始的前52个字节) ③ nm: 查看目标文件中出现的符号...(函数、全局变量等)。...上面可以看到,nm列出的信息总共有三列:第一列是指程序运行时的符号所对应的地址,对于函数来说表示的是函数的开始地址,对于变量则表示的是变量的存储地址;第二列是指相应符号是放在内存的哪一个段;第三列则是指符号的名称...;给定地址和可执行文件名称,它使用其中的调试信息判断与此地址有关联的源文件和行号,通常搭配 nm 使用。...编译时编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件中的符号,比如全局变量或者调用了某个库函数中的函数,那么这时候,在这个文件中该符号的地址是没法确定的,只能由链接器把所有的目标文件链接到一起才能确定最终的地址

    53010

    Shell命令(readelf)

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

    1.2K20

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

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

    3.2K12

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

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

    1.2K20

    ELF文件结构描述

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

    1.6K50

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

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

    86530

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

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

    1.8K10

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

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

    4.3K30

    CSAPP---第七章-链接

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

    92110

    动态链接的步骤与实现

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

    1.4K20

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

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

    80910
    领券