news 2026/9/3 2:28:14

JVM中对于源码中符号的管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM中对于源码中符号的管理

JVM中对于源码中符号的管理

1 符号的用途

首先,我们要确定什么是符号?

以最简单的C语言为例说明

#include <stdio.h> int main(){ int i = 10; printf("%d",i); return 0; }

上述代码中所有的变量名和函数名是符号(Symbol),如main,i其他的如int,return等都不为符号,他们为C语言本身的关键字。

符号的作用是当两个目标文件在做链接时可以准确地找到目标。比如,在目标文件A中定义了函数foo,目标文件B引用目标文件A中的函数foo时必须保证唯一且准确地找到该函数。此时,每个函数或变量都必须有自己独特的名字才不至于被混淆。(来自《程序员的自我修养》P81)

2 静态语言的符号

静态语言编译器gcc将上述代码编译后,其符号会被放入目标文件(.o)的符号表中。以上述代码为例

由于目标文件(.o)是二进制文件,可以使用nm工具查看

其中,T表示全局符号,U表示Undefine,即未定义,需要外部链接使用才可以。i不放入符号表是因为编译器根据源码逻辑直接将其优化,将100作为参数赋予printf函数。

使用下面的命令可以查看其表头的信息

readelf -S main.o There are 14 section headers, starting at offset 0x268: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [11] .symtab SYMTAB 0000000000000000 00000100 0000000000000090 0000000000000018 12 4 8 [12] .strtab STRTAB 0000000000000000 00000190 0000000000000014 0000000000000000 0 0 1

可以看到符号表的信息

起始地址大小
距离文件头0x100字节处0x90字节

下面是使用visual studio code查看相关的二进制内容

在该表中如何定位我们用nm命令找出的mainprintf呢?

由于符号表的数据结构如下

typedef struct { Elf64_Word st_name; /* 符号名在字符串表中的偏移量 */ unsigned char st_info; /* 类型和绑定信息 */ unsigned char st_other; /* 可见性 */ Elf64_Half st_shndx; /* 所属节索引 */ Elf64_Addr st_value; /* 符号值/地址 */ Elf64_Xword st_size; /* 符号大小 8字节*/ } Elf64_Sym;


可知一个Elf64_Sym项目长度为24个字节,那么上述0x90个字节长度的符号表应该保存6个符号项。我们可以用下面的命令来分析二进制目标文件看看是不是6个项目

jx@jx-virtual-machine:~/src/c$ readelf -s main.o Symbol table'.symtab'contains6entries: Num: Value Size Type Bind Vis Ndx Name0: 00000000000000000NOTYPE LOCAL DEFAULT UND1: 00000000000000000FILE LOCAL DEFAULT ABS main.c2: 00000000000000000SECTION LOCAL DEFAULT1.text3: 00000000000000000SECTION LOCAL DEFAULT5.rodata4: 000000000000000051FUNC
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 20:04:43

学长亲荐9个AI论文工具,研究生高效写作必备!

学长亲荐9个AI论文工具&#xff0c;研究生高效写作必备&#xff01; AI 工具助力论文写作&#xff0c;效率提升不是梦 在研究生阶段&#xff0c;论文写作不仅是学术能力的体现&#xff0c;更是时间与精力的挑战。随着 AI 技术的不断进步&#xff0c;越来越多的智能工具被引入到…

作者头像 李华
网站建设 2026/9/2 20:04:43

利尔达荣获维科杯·OFweek2025物联网行业杰出标杆企业奖

12月19日&#xff0c;维科杯OFweek2025&#xff08;第十届&#xff09;物联网行业年度评选颁奖典礼暨答谢晚宴在深圳圆满落幕。凭借卓越的市场表现、持续的技术创新能力及在多领域的深度场景落地成果&#xff0c;利尔达成功斩获2025年度“杰出标杆企业奖”。作为物联网领域极具…

作者头像 李华
网站建设 2026/9/2 20:04:24

不同操作系统下MySQL安装详细指南与步骤解析

MySQL是一种广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;。它通常与许多应用程序一起使用&#xff0c;包括Web应用程序、企业级软件及数据存储解决方案。随着其在全球的普及&#xff0c;用户可以在多种操作系统上安装MySQL。本文将详细介绍如何在不同操作…

作者头像 李华
网站建设 2026/9/2 20:04:58

2025必备10个降AI率工具,MBA人必看!

2025必备10个降AI率工具&#xff0c;MBA人必看&#xff01; AI降重工具&#xff0c;MBA人不可不知的利器 在当前学术环境日益重视原创性的背景下&#xff0c;MBA学生和研究者面对论文写作时&#xff0c;往往需要同时兼顾内容质量与查重率。随着AIGC&#xff08;人工智能生成内容…

作者头像 李华
网站建设 2026/9/2 20:04:57

OPPO与新加坡国大MemEvolve:AI记忆系统实现自我进化

这项由OPPO AI智能体团队与新加坡国立大学LV-NUS实验室共同完成的突破性研究发表于2024年12月23日&#xff0c;研究成果已在arXiv平台发布&#xff08;论文编号&#xff1a;2512.18746v1&#xff09;。有兴趣深入了解的读者可以通过该编号查询完整论文&#xff0c;相关代码也已…

作者头像 李华
网站建设 2026/9/2 21:57:27

设计模式的分类

创建型模式 用于描述怎样创建对象&#xff0c;它的主要特点是将对象的创建与使用分离 单例&#xff0c;原型&#xff0c;工厂方法&#xff0c;抽象工厂&#xff0c;建造者 结构型模式 用于描述如何将类或对象按某种布局组成更大的结构 代理&#xff0c;适配器&#xff0c;桥接&…

作者头像 李华