предисловие
На эту статью есть три основные причины:
-
Первый аспект - потому что в предыдущих статьях,Время запуска загрузчика классов процесса инициализацииЭти два фрагмента контента перемежаются большим количеством исходного кода HotSpot, обязательно будут небольшие партнеры.Я хочу сам следовать исходному коду HotSpot, поэтому я напишу здесь специальную статьюСреда чтения исходного кода HotSpotСтатьи для тех, кому это нужно
-
Далее, это будет обсуждаться в более поздней статьеПроцесс создания объекта, алгоритм сборки мусора, безопасная точка и безопасная зона GC, сборщик мусораВ ожидании серии контента, она неизбежно будет задействованаИсходный код точки доступатак что лучше поставить его сейчасНастроена среда чтения исходного кода, затем шаг за шагом следуйте идеям статьи.
-
Последний аспект также является проблемой:Вы действительно не заинтересованы в JVM?
Итак, без лишних слов, давайте готовиться к сборке! ! !
Готов к работе
Первая ссылка: подготовка программного обеспечения
Я здесь для своей среды, вы можете построить ее в соответствии со своей средой, причина та же.
- ОС: система Mac
- IDE: Клион
- Исходный код: OpenJDK8
Вторая ссылка: построение среды
IDE Clion
Сначала вам нужно установить Clion, потому что виртуальная машина HotSpot написана на C++,Ссылка здесь, нажмите на меня
Доступна тестовая IDE Clion
После установки Clion просто создайте новый проект и протестируйте его, чтобы убедиться, что Clion можно нормально использовать.
Затем мы нажимаем «Создать», скриншот отчета о найденных неисправностях ниже, введитеmissing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Эта строка кода ошибки, Baidu заявила, что она отсутствуетИнструменты командной строкиИнструменты, затем загрузите этот инструмент
Установить инструменты командной строки
Перейдите на сайт разработчиков Apple:Пожалуйста, нажмите здесь, чтобы войти, чтобы загрузить, установите файл PKG после загрузки
После установки открыл Clion, обнаружил, что исходная ошибка местами выделена серым цветом, и объяснил, что исправил
После запуска основной функции вывод также нормальный, что указывает на то, что Clion установлен правильно.
Загрузите исходный код openjdk
IDE готова, следующим шагом будет подготовка исходного кода openjdk, т.к.官网下载网速太慢,容易文件下不全
, я нашел поддерживаемую сообществом версию openjdk-jdk8u прямо в Интернете
https://github.com/AdoptOpenJDK/openjdk-jdk8u
Третья ссылка: скомпилировать исходный код
После загрузки последнего исходного кода OpenJDK вам нужно скомпилировать его
Готов к компиляции Инструменты
// 加速编译
brew install ccache
// 字体引擎,编译过程中会被依赖到
brew install freetype
brew install autoconf
// 分布式版本控制
brew install mercurial
Настроить BOOT_JDK很重要,不然编译会报出各种千奇百怪的问题
Перед компиляцией нужно настроить что-то под названием BOOT_JDK, версия которого на один уровень ниже скомпилированной версии, то есть для компиляции OpenJDK8 нужно установить JDK7 как средуOpenJDK7 или OracleJDK7 могут быть
Установить скомпилированнуюb很重要,解决头文件费了将近两天,最后发现安装这玩意就好了,我吐血了
На самом деле, причина этого шага заключается в том, чтобы решить проблему, заключающуюся в том, что многие заголовочные файлы не могут быть найдены при компиляции исходного кода openjdk.
Требования для установки: требуется python3+,brew install python3
Затем вам нужно установить PIP, инструкции по установке:curl bootstrap.pypa.io/get-pip.py | python3
наконец прошлоустановка pip скомпилированаbВот и все, команда:pip install compiledb
Настроить переменные среды
vi ~/.bash_profile
Вставьте следующую информацию о конфигурации внизу файла .bash_profile:
# 设定语言选项,必须设置
export LANG=C
# Mac平台,C编译器不再是GCC,而是clang
export CC=clang
export CXX=clang++
export CXXFLAGS=-stdlib=libc++
# 是否使用clang,如果使用的是GCC编译,该选项应该设置为false
export USE_CLANG=true
# 跳过clang的一些严格的语法检查,不然会将N多的警告作为Error
export COMPILER_WARNINGS_FATAL=false
# 链接时使用的参数
export LFLAGS='-Xlinker -lstdc++'
# 使用64位数据模型
export LP64=1
# 告诉编译平台是64位,不然会按照32位来编译
export ARCH_DATA_MODEL=64
# 允许自动下载依赖
export ALLOW_DOWNLOADS=true
# 并行编译的线程数,编译时长,为了不影响其他工作,可以选择2
export HOTSPOT_BUILD_JOBS=4
export PARALLEL_COMPILE_JOBS=2 #ALT_PARALLEL_COMPILE_JOBS=2
# 是否跳过与先前版本的比较
export SKIP_COMPARE_IMAGES=true
# 是否使用预编译头文件,加快编译速度
export USE_PRECOMPILED_HEADER=true
# 是否使用增量编译
export INCREMENTAL_BUILD=true
# 编译内容
export BUILD_LANGTOOL=true
export BUILD_JAXP=true
export BUILD_JAXWS=true
export BUILD_CORBA=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
# 编译版本
export SKIP_DEBUG_BUILD=true
export SKIP_FASTDEBUG_BULID=false
export DEBUG_NAME=debug
# 避开javaws和浏览器Java插件之类部分的build
export BUILD_DEPLOY=false
export BUILD_INSTALL=false
# 最后需要干掉这两个环境变量(如果你配置过),不然会发生诡异的事件
unset JAVA_HOME
unset CLASSPATH
Сделайте так, чтобы переменные среды вступили в силу:
source ~/.bash_profile
Выполните команду подтверждения файла конфигурации
Войдите в загруженный каталог openjdk и выполните команду проверки файла конфигурации.注意:一定要切换到BOOT_JDK的版本下执行
sh configure --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/ --disable-zip-debug-info --disable-debug-symbols --with-debug-level=slowdebug --with-target-bits=64 --with-jvm-variants=server
Случай ошибки файла конфигурации выполнения
- После выполнения сообщается об ошибке на следующем рисунке, что означает, чтоНе удалось определить версию Xcode
解决办法
: перейдите на сайт разработчиков Apple:Пожалуйста, нажмите здесь, чтобы войтиЗагрузите Xcode, соответствующий версии системы Mac, запомните после загрузки Xcode执行下面的命令
, иначе все равно будет сообщено об ошибке на картинке выше
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
-
Xcode 4 is required to build JDK 8
вина
解决办法
: найти файл конфигурации и открыть егоvim common/autoconf/generated-configure.sh
, найдите место, где можно судить о версии, и закомментируйте этот абзац.
#Fail-fast: verify we're building on Xcode 4, we cannot build with Xcode 5 or later
XCODE_VERSION=`$XCODEBUILD -version | grep '^Xcode ' | sed 's/Xcode //'`XC_VERSION_PARTS=( ${XCODE_VERSION//./ } )
if test ! "${XC_VERSION_PARTS[0]}" = "4"; then
as_fn_error $? "Xcode 4 is required to build JDK 8, the version found was $XCODE_VERSION. Use --with-xcode-path to specify the location of Xcode 4 or make Xcode 4 active by using xcode-select." "$LINENO" 5
fi
#
-
A gcc compiler is required
Проблема
解决办法
: найдите следующий код подтверждения и закомментируйте его,Обратите внимание, что есть два места, код одинаковый, по знакам на рисунке ниже, чтобы найти
if test $? -ne 0; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5
$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5
$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&6;}
as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
fi
Появится следующий рисунок, который доказывает, что проверка завершена.Примечание. Чтобы подтвердить версию Boot JDK
начать компиляцию每一次编译都要耗费很多的时间,所以建议把文中的错误都改了之后,再进行编译
воплощать в жизньcompiledb make WARNINGS_ARE_ERRORS="" CONF=macosx-x86_64-normal-server-slowdebug allкоманда для компиляции
Если есть ошибка, обязательно перекомпилируйте, выполнив следующие шаги:
- compiledb make CONF=macosx-x86_64-normal-server-slowdebug clean
- compiledb make WARNINGS_ARE_ERRORS="" CONF=macosx-x86_64-normal-server-slowdebug all
compiledb make WARNINGS_ARE_ERRORS="" CONF=macosx-x86_64-normal-server-slowdebug all
Скомпилированный случай ошибки
-
fatal error: 'iostream' file not found的问题
:solution: установить переменную среды
NEW_INCLUDE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
export CFLAGS=-I$NEW_INCLUDE
export CXXFLAGS=-I$NEW_INCLUDE
-
library not found for -lstdc++的问题
: Решение: выполните следующие действия.
- Клонировать инструмент:
git clone https://github.com/quantum6/xcode-missing-libstdcpp
(Примечание: содержимое этого файла будет программно связано с Xcode, поэтому этот каталог нельзя удалить) - Затем войдите в инструмент и выполните sh install.sh
- Настроить переменные среды
NEW_LIB=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib
export LDFLAGS="-L${NEW_LIB}"
export LIBRARY_PATH=$NEW_LIB:$LIBRARY_PATH
-
symbol(s) not found for architecture x86_64
Проблема: Решение: найти файлjdk/src/macosx/native/sun/osxapp/ThreadUtilities.m
, затем поставьтеinline void attachCurrentThread(void** env) 改为static inline void attachCurrentThread(void** env)
Undefined symbols for architecture x86_64:
"_attachCurrentThread", referenced from:
+[ThreadUtilities getJNIEnv] in ThreadUtilities.o
+[ThreadUtilities getJNIEnvUncached] in ThreadUtilities.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
-
clang: error: unknown argument: '-fpch-deps'
Проблема, решение: редактироватьhotspot/make/bsd/makefiles/gcc.make
Прокомментируйте следующий код
ifeq ($(USE_CLANG),)
ifneq ($(CC_VER_MAJOR), 2)
DEPFLAGS += -fpch-deps
endif
endif
-
error: invalid argument '-std=gnu++98' not allowed with 'C'
Проблема, Решение: Редактироватьcommon/autoconf/generated-configure.sh
,поиск-std=gnu++98
эта строка и комментарий
- Решите проблему сбоя после компиляции в режиме медленной отладки: после компиляции в режиме медленной отладки будет ошибка сбоя JVM после выполнения java -version. найти файл
hotspot/src/share/vm/runtime/perfMemory.cpp
документ. Закомментируйте следующее:
-
implicit declaration of function 'VerifyFixClassname' is invalid in C99
Проблема: Решение: включить заголовочный файл или прямое внешнее объявлениеЛучше всего включить заголовочный файл, если вы не можете его найти, объявите его напрямую
extern jboolean VerifyFixClassname(char* name);
extern jboolean VerifyClassname(char* name, jboolean allowArrayClass);
-
implicit declaration of function 'pthread_main_np' is invalid in C99
Проблема: та же, что и вышеЛучше всего включить заголовочный файл, если вы не можете его найти, объявите его напрямую
extern jboolean pthread_main_np();
-
implicitly declaring library function 'strchr' with type 'char *(const char *, int)'
Проблема: та же, что и вышеЛучше всего включить заголовочный файл, если вы не можете его найти, объявите его напрямую
#include <stdio.h>
#include <string.h>
-
implicit declaration of function 'time' is invalid in C99
Проблема: та же, что и вышеЛучше всего включить заголовочный файл, если вы не можете его найти, объявите его напрямую
#include <time.h>
-
implicit declaration of function 'JVM_ActiveProcessorCount' is invalid in C99
Проблема: здесь напрямую изменено наjint ncpus = 4;
jint ncpus = 4;
Четвертая ссылка: импортировать исходный код в Clion и настроить его
Если появится интерфейс, показанный на рисунке ниже, это означает, что编译成功
, после компиляции можно получить большое количествоNo such file or directory的警告。
Не беспокойтесь об этом, следующим шагом будет импорт скомпилированного исходного кода в Clion.
из-за использованияскомпилированныйb пакет компилирует исходный код OpenJDK. Итак, после завершения компиляции мы можем увидеть еще один в корневом каталоге исходного кода.compile_commands.json文件
. Импорт нашего проекта зависит от этого файла json.
Откройте Clion, затем нажмите «Открыть», чтобы открыть вышеуказанноеcompile_commands.json文件
и выберите «Открыть как проект» во всплывающем диалоговом окне.
等待导入成功后
, в Клионеpreferences->Build,Execution,Deployment->Custom Build Targets
, нажмите на страницу изменения конфигурацииAdd Target
настроить пользовательскийBuild Targets
.
Введите имя самостоятельно, и Toolchain выберет значение по умолчанию.
Создайте новый инструмент, один make_jdk8, другой clean_jdk8,(Вы можете выбрать имя самостоятельно)
make_jdk8: где аргументы заполняются:CONF=macosx-x86_64-normal-server-slowdebug,Working directory则添加源码的根目录。
clean_jdk8: Заполните аргументы:CONF=macosx-x86_64-normal-server-slowdebug clean,Working directory则添加源码的根目录。
Затем завершите конкретную настройку Clutom Build Targets, конкретная конфигурация выглядит следующим образом:
Затем нажмите на главную страницу ClionAdd Configuration
, добавить конфигурациюRun/Debug Configurations。
Пятая ссылка: начать отладку
После того, как все настроено, мы можем приступить к отладке кода. Сначала добавьте точку останова в create_vm файла jni.cpp.
На этом этапе отладка отладки настроена, и среда чтения исходного кода HotSpot завершена. Надеюсь, у всех все получится! ! !
болтовня
Наконец, если вы чувствуете какую-либо путаницу в статье, пожалуйста, оставьте комментарий как можно скорее.маленький новичокЕсли у меня что-то есть, ставьте лайк 👍 Подписывайтесь ❤️ Делитесь 👥 Мне это очень полезно! ! ! Если вы хотите получить огромные ресурсы JavaПростые в использовании плагины идей, шаблоны резюме, шаблоны проектирования, многопоточность, архитектура, стиль программирования, промежуточное ПО..., вы можете обратить внимание на публичный аккаунт WeChatЭнциклопедия Java, Наконец, спасибо за вашу поддержку! ! !