专栏首页程序员升级之路Centos编译JDK8源码

Centos编译JDK8源码

开发机配置如下:Linux内核是2.6,Centos版本为6.9,应该差异不大。

1、准备环境

因为内核是用C++编写的,因此需要GCC,我开发机版本为8.1.0;

make为3.8.1,本来装了个较新为4.2的版本,也不行,换成3.8.1才好;

JDK

这个可能要注意,因为整个JDK源代码只有JVM等核心代码是用C/C++编写,一些类库还是Java编写的,最后需要编译为class文件,这部分的工作需要另外一个JDK来编译;网上说编译8的JDK要用1.7的,我用1.8的也可以编译通过,我用的版本是1.8.0_231。

其它还有一大堆库,可以自行用yum安装

yum -y install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel

yum -y install cups-devel

yum -y install alsa-lib-devel

2、下载源码

有两种下载方式,一个是github,地址为:

https://github.com/openjdk/jdk

另一个是用hg下载,推荐大家用hg,我用gitlab下载的代码编译一堆报错,改为hg下载再编译就通过了。

hg下载命令

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u

3、编译

3.1、先进入到源代码根目录

 cd jdk8u

3.2、然后下载源代码,默认有的代码是没下载的

bash ./get_source.sh

3.3、然后是配置编译参数

bash ./configure --with-target-bits=64 --with-debug-level=slowdebug --enable-debug-symbols --with-native-debug-symbols=internal --with-extra-ldflags=-liconv

注意几个参数

with-debug-level=slowdebug:带调试信息,有几个选项:none即不带调试信息,还有个fastdebug的,调试信息有限,建议用slowdebug,调试信息最多。

enable-debug-symbols和with-native-debug-symbols:都是开启调试信息的,第1次编译的时候只开启了enable-debug-symbols,调试JVM相关函数的时候没有断点信息,带上with-native-debug-symbols就可以了。

with-extra-ldflags=-liconv:这个是因为我在编译的时候报iconv相关函数找不到,报错如下:

utf_md.c:(.text+0xb6): undefined reference to `libiconv_open'
utf_md.c:(.text+0xf8): undefined reference to `libiconv_open'

这个根据自己情况是否添加。

3.4 开始编译

make CONF=linux-x86_64-normal-server-slowdebug

CONF参数是一个编译的配置,我们可以配置不同的编译参数,如一个用于生产不带调试信息,另一个带调试信息;配置好后会在build目录下生成相应的文件夹。

4、常见编译错误

4.1、invalid suffix on literal; C++11 requires a space between literal and string macro [-Werror=literal-suffix]

这个是因为编译器告警级别太高,解决办法:

修改:hotspot/make/linux/makefiles/gcc.make

# WARNINGS_ARE_ERRORS = -Werror
WARNINGS_ARE_ERRORS = -Wno-all

4.2、error: left operand of shift expression ‘(-1 << 28)’ is negative [-fpermissive]

解决办法:修改:hotspot/make/linux/makefiles/gcc.make

增加以下内容:

CFLAGS += -fpermissive

其它错误根据情况百度下,一般来说是缺少库什么的,用yum安装就可以了;还有就是编译参数,修改相关Makefile就可以。

5、调试

经过上述编译后,我们就可以用GDB编译了,我开发机的GDB版本为9.1。

先写个HelloWorld的Java代码,保存为Hello.java:

public class Hello{
  public static void main(String[] args){
    System.out.println("hello world");
  }
}

然后用javac编译下,javac的路径在:

./build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac

开始调试Java:

gdb ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java

运行gdb后设置调试参数:

set args Hello

然后设置断点在入口的main函数:

break jdk/src/share/bin/main.c:97

接下来就可以开始在jdk源代码中遨游了。

一些关键的函数如下:

JNI_CreateJavaVM
JNI_GetDefaultJavaVMInitArgs
JNI_GetCreatedJavaVMs

JavaMain
create_vm

本文分享自微信公众号 - 程序员升级之路(gh_1fab42db66cb),作者:刘江华

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-13

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OcceanBase介绍

    OcceanBase是淘宝开源的一个分布式关系数据库,以下是其官方地址:https://oceanbase.alipay.com/

    心平气和
  • 升级Php Curl扩展遇到的坑

    线上服务器php引用的curl扩展依赖的curl库版本是7.29.0,业务想升级到7.71以上版本,因为这个版本支持域名配置HOST,即做一个后台推送功能,在后...

    心平气和
  • PHP内存池分析

    操作系统适合管理大块内存,如一页(4096字节),不适合小块内存分配;不做内存池管理,容易产生内存碎片,会出现剩余内存够,但没有一块连续内存来分配,会...

    心平气和
  • 正式进军云服务器市场,高通发布Cloud AI 100推理芯片

    提起高通,业内对它的直接印象就是移动芯片领域的巨头。一直以来,高通也确实只在移动通信领域深耕,并从芯片到底层平台一揽子都包下。而现在,高通冷不丁扔出的一枚“炸弹...

    镁客网
  • 如何设计开发好一个 HTTP API?

    在过去的几年里,我使用着各式各样的HTTP API。这些API通常不是公开的,只是提供给合作伙伴公司。此外,我也看了很多开发者提供的API,自己也参与了几个AP...

    企鹅号小编
  • PHP实现四种基本排序算法

    前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。 $arr(1,43,54,62,21,66,32,78,...

    公众号php_pachong
  • PHP实现四种基本排序算法

    许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发...

    wangxl
  • 基于场景选择微服务的API范式:REST、GraphQL、Webhooks和gRPC

    原题:When to Use What: REST, GraphQL, Webhooks, & gRPC

    yuanyi928
  • PHP实现四种基本排序算法

    许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发...

    wangxl
  • Centos7安装python3以及Scapy3介绍

    Redhat:主要是服务器型Linux,商用收费;RHEL是Red Hat Enterprise Linux的缩写。

    刘銮奕

扫码关注云+社区

领取腾讯云代金券