news 2026/6/10 21:35:06

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/6/10 14:52:59

构建高效任务中心:CDC 数据同步的工程实践与架构权衡

构建高效任务中心&#xff1a;CDC 数据同步的工程实践与架构权衡 在现代业务系统中&#xff0c;任务中心&#xff08;Task Center&#xff09;作为连接数据与行动的核心枢纽&#xff0c;其核心能力之一是从上游业务数据库中可靠、高效、低延迟地同步关键状态变更&#xff0c;并…

作者头像 李华
网站建设 2026/6/10 16:04:48

自动化测试报告设计分享

在软件质量保障体系中&#xff0c;自动化测试已成为不可或缺的环节。然而&#xff0c;测试的价值不仅在于执行过程&#xff0c;更在于结果的呈现与分析。一份精心设计的自动化测试报告&#xff0c;能够将复杂的测试数据转化为有价值的洞察&#xff0c;帮助团队快速定位问题、评…

作者头像 李华
网站建设 2026/6/10 19:16:21

中国刺绣文化网站作品阐释

一、设计过程1. 需求分析与概念设计在设计中国刺绣文化网站之初&#xff0c;进行了详尽的市场调研和需求分析。中国刺绣文化源远流长&#xff0c;拥有深厚的文化底蕴和广泛的受众基础。然而&#xff0c;随着现代生活节奏的加快&#xff0c;传统刺绣文化的传播和普及面临诸多挑战…

作者头像 李华
网站建设 2026/6/10 16:03:43

软件工程的国家标准和机器人制作的国家标准

文章目录一、软件工程的国家标准&#xff08;中国&#xff09;1️⃣ 软件工程核心通用标准✅ **GB/T 8566—2007**2️⃣ 软件质量与管理相关标准3️⃣ 软件开发过程与文档规范&#x1f4cc; 小结&#xff08;软件工程&#xff09;二、机器人制作的国家标准&#xff08;中国&…

作者头像 李华
网站建设 2026/6/10 20:34:08

Linux 服务管理

systemd 介绍系统启动管理进程CentOS 5 使用 Sys init 引导系统启动&#xff0c;启动速度最慢&#xff0c;采用串行方式启动&#xff0c;无论进程相互之间有无依赖关系。CentOS 6 使用 Upstart init 引导系统启动&#xff0c;启动速度快一点&#xff0c;有依赖的进程之间依次启…

作者头像 李华
网站建设 2026/6/10 14:48:36

【计算机毕业设计案例】基于springboot的汽车租赁管理系统“车辆管理 - 订单履约 - 数据分析(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华