当前位置: 首页 > news >正文

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
http://www.jsqmd.com/news/144651/

相关文章:

  • 基于 YOLOv5n 的课堂手机检测系统:让“低头族”无处遁形
  • 中国刺绣文化网站作品阐释
  • 2025年防水透气阀呼吸器源头厂家权威推荐榜单:防水防尘透气阀/卡扣防水透气阀/铝合金防水透气阀源头厂家精选 - 品牌推荐官
  • 开学第一课,打印Hello World!
  • 微信公众号SVG玩法全测评:点击自动换图
  • 2025年目前口碑好的仓库货架定制厂家口碑推荐榜单,重型货架/仓储货架/货架/阁楼货架/层板货架,仓库货架产品口碑排行榜 - 品牌推荐师
  • NVIDIA Isaac Launchable 硬编码凭证漏洞深度剖析
  • 智能音乐推荐小程序的设计与实现开题报告 - 副本
  • PLC ethercat总线伺服资料 信捷PLC EtherCat总线9轴凸轮伺服,包括PLC...
  • 如何禁止C++类对象的禁止拷贝操作
  • 基于MATLAB的HSV颜色特征杂草图像识别系统设计与实现
  • 2026 必藏!十大设计师、美工、运营素材网站!正版狂喜! - 品牌2026
  • 2025-2026年口碑好的烟尘在线监测仪制造商推荐:哪家做得好+哪家性价比高+知名品牌 - 品牌推荐大师1
  • 2025年市场知名的横梁货架厂商推荐榜,阁楼货架/仓储货架/货架/重型货架/穿梭式货架,横梁货架直销厂家口碑推荐 - 品牌推荐师
  • Dapper 异常情况记录
  • 2026 十大高清免费版权图片素材下载网站推荐,合规商用冲! - 品牌2026
  • 基于大数据的国产跑鞋推荐与可视化分析系统(毕设源码+文档)
  • 2025年三效废水蒸发处理定做厂家权威推荐榜单:石墨多效蒸发器/三效蒸发系统/钢衬石墨蒸发源头厂家精选 - 品牌推荐官
  • 2025年12月江苏徐州装修、装修设计、装修施工、设计工作室、别墅设计哪家专业可靠 - 2025年品牌推荐榜
  • 智能音乐推荐小程序的设计与实现开题报告
  • 铜箔加工制造商推荐:一站式服务+快速打样(附案例) - 品牌排行榜
  • AI浪潮下的前端范式转移:从代码实现者到思维架构师
  • 上海铜箔制造企业综合实力榜(2025选型指南)——军工级定制与快速交付视角 - 品牌排行榜
  • 利尔达荣获维科杯·OFweek2025物联网行业杰出标杆企业奖
  • 学长亲荐10个AI论文软件,自考毕业论文轻松搞定!
  • indent and unindent in vscode and its descendant when tab/shift-tab not work
  • 最新上海装修公司口碑排名:零投诉+15000平生产基地 - 品牌排行榜
  • 互联网大厂面试攻略:Java小白如何应对微服务与云原生技术
  • 2026 十大图库推荐:找可下载图片素材的靠谱平台清单 - 品牌2026
  • Android Studio - 解决 Using ‘jvmTarget: String‘ is an error. Please migrate to the compilerOptions DSL