阅读Java Native源码前的准备

前言

读java native源代码时,我们一般会去网站下载openjdk8源码http://download.java.net/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip ,然后进行分析,随后很多文章会让你编译。其实,如果只是为了分析源码,完全不用编译,直接找到hotspot文件夹下的src文件夹查看即可,这里就是hotspot的源码。

注意:官网的源码下载地址写错了,它写成了http://www.java.net/download/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip,这个网址是打不开的

存在的问题

源码中的include 路径不全,导致很多函数无法跳转,只得手动查找,很不方便。以 ./src/cpu/sparc/vm/assembler_sparc.cpp文件为例,原始代码是这样的:

#include "precompiled.hpp"
#include "asm/assembler.hpp"
#include "asm/assembler.inline.hpp"

int AbstractAssembler::code_fill_byte() {
  return 0x00;                  // illegal instruction 0x00000000
}

我们希望是这样的:

#include "./src/share/vm/precompiled/precompiled.hpp"
#include "./src/share/vm/asm/assembler.hpp"
#include "./src/share/vm/asm/assembler.inline.hpp"

int AbstractAssembler::code_fill_byte() {
  return 0x00;                  // illegal instruction 0x00000000
}

分析问题&解决方案

当然,我们可以手动寻找对应的头文件,然后一个一个补全;但是文件数量有上千个,这样会耗费许多时间,也因此有了本项目——自动补全include中的路径。查看不同文件中的include路径,发现有两大类,一类是include "precompiled.hpp",一类是包含在文件夹./src/share/vm下的各个头文件,如asmprimsooputilities等,因此解决步骤如下:

  1. 对于"precompiled.hpp",我们可以直接用编辑器将其全部替换为include "./src/share/vm/precompiled/precompiled.hpp"`;
  2. 对于其他诸如include "asm/assembler.hpp"#include "oops/oop.inline.hpp"#include "utilities/accessFlags.hpp"等依赖不同文件路径的头文件,利用本项目中的程序自动将其补全。

源码

参见https://github.com/xiaoxi666/ModifyIncludePath

实现原理

  1. 遍历src文件夹下的所有文件,找出后缀为cpphppch的文件,将其保存在List中;同时将对应的文件夹路径保存在Set中(之所以选择Set而不是List是因为同一文件夹下可能有很多文件,而文件夹保存一次就好);
  2. 处理List中保存的文件,每个文件处理时读取Set中匹配的文件夹,将诸如#include "asm等形式替换成#include "./src/share/vm/asm,即可。

其他问题

还有一些文件依赖于特定的平台,如./src/share/vm/utilities/copy.hpp中:

#ifdef TARGET_ARCH_x86
# include "copy_x86.hpp"
#endif
#ifdef TARGET_ARCH_sparc
# include "copy_sparc.hpp"
#endif
#ifdef TARGET_ARCH_zero
# include "copy_zero.hpp"
#endif
#ifdef TARGET_ARCH_arm
# include "copy_arm.hpp"
#endif
#ifdef TARGET_ARCH_ppc
# include "copy_ppc.hpp"
#endif

此种代码程序并未处理,因此依赖平台的函数还是有可能找不到,有需要的可以将程序中的

static String startInclude = "#include \"";替换为static String startInclude = "# include \"";再运行一次即可(注意#和include之间多了一个空格)。

运行须知

本程序运行时,建议将hotspot的源码目录src单独放在工程下的一个文件夹(本项目中为/Resource)中,防止混乱。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

使用asp调用.net xml web services

(是不是实际上可以用这个办法调用任何xml web services呢?高人答一下) 最近在做一个web services,由我来写文档。为了方便广大asp用户...

2677
来自专栏一个会写诗的程序员的博客

Cookie 和 Session 机制原理分析 & 区别对比

Web application servers are generally "stateless":

1472
来自专栏安恒网络空间安全讲武堂

IAT Hook 技术分析

来源:https://pentest.blog/offensive-iat-hooking/

1982
来自专栏乐沙弥的世界

Percona XtraDB Cluster GCache和Record-Set缓存

在Percona XtraDB集群中,有一个GCache和Record-Set缓存(也可称为事务写集缓存)的概念。如果您正在运行长事务,那么使用这两个缓存通常会...

1230
来自专栏xingoo, 一个梦想做发明家的程序员

【手把手教你Maven】构建过程

Maven是一款进行 依赖管理、项目构建、信息管理 为一体的工具。 它不像Make具有复杂的命令、也不像Ant需要手动编写大量的重复代码就能进行项目的构建;...

2135
来自专栏阮一峰的网络日志

Systemd 入门教程:命令篇

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。 本文介绍它的基本用法,分为上下两篇。今天介绍它的主要命令,下一篇介绍...

3606
来自专栏IT笔记

使用elasticsearch遇到的一些问题以及解决方法

1.由gc引起节点脱离集群 因为gc时会使jvm停止工作,如果某个节点gc时间过长,master ping3次(zen discovery默认ping失败重试3...

4084
来自专栏重庆的技术分享区

如何在Ubuntu 16.04上安装和配置Redis集群

Redis集群已经发展成为缓存,队列等的流行工具,因为它具有可扩展性和速度的潜力。本指南旨在使用三个Linode创建一个集群来演示分片。然后,如果发生故障,您将...

1376
来自专栏V站

php://协议深入理解

今天晚上,听了漏洞银行的大咖公开课讲的内网渗透,感觉和大咖之间还有不少差距,不过搞到了一波工具,心里依然美滋滋~

5304
来自专栏Albert陈凯

2018-11-19 Neo4j百万级数据导入只能用neo4j-import

业务需要使用Neo4j出数据关系展示图,数据库里有2张表通过一个字段进行关联,数据量是90万和500万,关系量是150w;

1222

扫码关注云+社区

领取腾讯云代金券