Julia 在 OpenHarmony 下的编译实战:从源码构建到运行全流程
编译背景
JULIA目前版本不支持除x86_64-w64-mingw32之外的交叉编译,要么在OHOS系统环境下直接进行编译(目前这种方案还没有找到可用的环境,所以暂时不考虑),要么修改Makefile进行交叉编译。
目前可用的方案是通过OHOS自带的CLANG和GCC编译器进行交叉编译,但是JULIA编译过程中要用到gFortran编译器,而OHOS-CLANG不支持gFortran语言,所以只能通过OHOS-GCC进行交叉编译,但是又由于OHOS-GCC不支持MUSL-C,最后剩下唯一的解决方案是通过自编译的MUSL-GCC在LINUX下进行交叉编译。
使用MUSL-GCC进行交叉编译,就需要用到MUSL-C库,并且MUSL-C库需要与OHOS保持版本一致。目前OH5.0的MUSL-C版本是1.2.5,OH5.0源码中MUSL-C版本是经过改动的,所以如果用标准版本的MUSL-C,则需要将OH5.0中的改动打PATCH,比较麻烦,最简单的方式是直接使用OH5.0自带的MUSL-C库。
编译步骤
在X86_64平台的LINUX系统上编译出MUSL-GCC的AARCH64交叉编译版本MUSL-GCC-AARCH64,然后使用MUSL-GCC-AARCH64去交叉编译JULIA源码。
编译JULIA分为两部分:JULIA的C代码主程序以及依赖库,JULIA语言的运行时库(也叫系统镜像)。
JULIA主程序通过MUSL-GCC-AARCH64编译,然后使用编译出来julia可执行程序来编译JULIA语言的运行时库。因为julia可执行程序是AARCH64平台指令,所以在X86_64平台LINUX系统上还需要安装QEMU AARCH64翻译程序(qemu,qemu-user-static),才能将JULIA语言的运行时库编译出来。
最后将JULIA源码目录usr目录中的二进制程序复制到OH系统上,执行julia主程序就可以跑起来了。
准备OHOS-MUSL-C库
tar cvzf musl-c-ohos.tar.gz /S11/wanghh/hisense7885/ohr41-uis7885-240513/out/sdk/obj/third_party/musl/usr

编译MUSL-GCC工程
git clone https://github.com/richfelker/musl-cross-make.git
cd /opt/git/musl-cross-make
cp config.mak.dist config.mak
vim config.mak:
TARGET = aarch64-linux-musleabi
MUSL_VER = 1.2.5
GCC_CONFIG += --enable-languages=c,c++,fortran
make && make install
cd output/aarch64-linux-musleabi

将第一步中生成的musl-c-ohos.tar.gz拷到这个目录:
tar xvzf musl-c-ohos.tar.gz
cp -rf usr/include/aarch64-linux-ohos/* include/
cp -rf usr/lib/aarch64-linux-ohos/* lib/
删除无用目录:
rm -rf usr
复制MUSL-C库到系统根lib目录,编译julia时qmeu会用到该库:
cp lib/libc.so /lib
ln -sf /lib/libc.so /lib/ld-musl-aarch64.so.1
准备julia编译环境
将以下内容保存为prepare_musl.sh,然后:source prepare_musl.sh
#!/bin/bash
NDK="/opt/git/musl-cross-make/output/bin"
target_host=aarch64-linux-musleabi
export AR=$NDK/$target_host-ar
export AS=$NDK/$target_host-as
export CC=$NDK/$target_host-gcc
export CXX=$NDK/$target_host-g++
export FORTRAN=$NDK/$target_host-gfortran
export LD=$NDK/$target_host-ld
export RANLIB=$NDK/$target_host-ranlib
export STRIP=$NDK/$target_host-strip
export OBJDUMP=$NDK/$target_host-objdump
export OBJCOPY=$NDK/$target_host-objcopy
export NM=$NDK/$target_host-nm
export CPPFLAGS="-I/opt/julia/julia-1.10.6/usr/include"
export CFLAGS="-fPIC -D__MUSL__=1 -I/opt/julia/julia-1.10.6/usr/include"
export CXXFLAGS="-fPIC -D__MUSL__=1 -I/opt/julia/julia-1.10.6/usr/include"
export LDFLAGS="-L/opt/julia/julia-1.10.6/usr/lib"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/julia/julia-1.10.6/usr/lib
sysctl -w vm.max_map_count=262144
编译julia源码
下载julia源码,进入源码目录执行vim Make.user,添加如下内容:
ARCH = aarch64
JULIA_CPU_TARGET = generic;cortex-a57
JULIA_PRECOMPILE = 0
USECLANG = 0
USEGCC = 1
USE_PERF_JITEVENTS = 0
USE_INTEL_JITEVENTS = 0
vim Make.inc, 修改内容如下:




最后在源码目录执行make&& make install DESTDIR=`pwd`/install开始编译,编译结果输出到usr目录。
运行julia确保以下代码可以运行成功:
function mandelbrot(a)
z = 0
for i=1:50
z = z\^2 + a
end
return z
end
for y=1.0:-0.05:-1.0
for x=-2.0:0.0315:0.5
abs(mandelbrot(complex(x, y))) < 2 ? print("*") : print(" ")
end
println()
end



或运行: ./julia -e "using InteractiveUtils; versioninfo(verbose = false)"


编译问题解决方法
链接llvm-ar时找不到compress2函数,其实是libz.so.1没有找到

cp -rf /opt/julia/julia-1.10.6/usr/lib/libz* /opt/julia/julia-1.10.6/deps/scratch/llvm-julia-15.0.7-10/build_Release/lib/
编译libgit2时找不到函数qsort_r,其实是OHOS-MUSL-C没有实现该函数


在/opt/julia/julia-1.10.6/deps/srccache/libgit2-e6325351ceee58cf56f58bdce61b38907805544f/src/util/util.c文件头部添加qsort_r()函数代码如下,并将util.c中的qsort_r()换成qsort_r_wanghh():
#ifndef a_ctz_32
#define a_ctz_32 a_ctz_32
static int a_ctz_32(uint32_t x)
{
#ifdef a_clz_32
return 31-a_clz_32(x&-x);
#else
static const char debruijn32\[32\] = {
0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13,
31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14
};
return debruijn32\[(x&-x)\*0x076be629 \>\> 27\];
#endif
}
#endif
#ifndef a_ctz_64
#define a_ctz_64 a_ctz_64
static int a_ctz_64(uint64_t x)
{
static const char debruijn64\[64\] = {
0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28,
62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11,
63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10,
51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12
};
if (sizeof(long) \< 8) {
uint32_t y = x;
if (!y) {
y = x\>\>32;
return 32 + a_ctz_32(y);
}
return a_ctz_32(y);
}
return debruijn64\[(x&-x)\*0x022fdd63cc95386dull \>\> 58\];
}
#endif
static int a_ctz_l(unsigned long x)
{
return (sizeof(long) \< 8) ? a_ctz_32(x) : a_ctz_64(x);
}
#define ntz(x) a_ctz_l((x))
static int pntz(size_t p\[2\]) {
int r = ntz(p\[0\] - 1);
if(r != 0 \|\| (r = 8\*sizeof(size_t) + ntz(p\[1\])) !=
8\*sizeof(size_t)) {
return r;
}
return 0;
}
static void cycle(size_t width, unsigned char\* ar\[\], int n)
{
unsigned char tmp\[256\];
size_t l;
int i;
if(n \< 2) {
return;
}
ar\[n\] = tmp;
while(width) {
l = sizeof(tmp) \< width ? sizeof(tmp) : width;
memcpy(ar\[n\], ar\[0\], l);
for(i = 0; i \< n; i++) {
memcpy(ar\[i\], ar\[i + 1\], l);
ar\[i\] += l;
}
width -= l;
}
}
/\* shl() and shr() need n \> 0 \*/
static void shl(size_t p\[2\], int n)
{
if(n \>= 8 \* sizeof(size_t)) {
n -= 8 \* sizeof(size_t);
p\[1\] = p\[0\];
p\[0\] = 0;
}
p\[1\] \<\<= n;
p\[1\] \|= p\[0\] \>\> (sizeof(size_t) \* 8 - n);
p\[0\] \<\<= n;
}
static void shr(size_t p\[2\], int n)
{
if(n \>= 8 \* sizeof(size_t)) {
n -= 8 \* sizeof(size_t);
p\[0\] = p\[1\];
p\[1\] = 0;
}
p\[0\] \>\>= n;
p\[0\] \|= p\[1\] \<\< (sizeof(size_t) \* 8 - n);
p\[1\] \>\>= n;
}
static void sift(unsigned char \*head, size_t width, git\_\_sort_r_cmp
cmp, void \*arg, int pshift, size_t lp\[\])
{
unsigned char \*rt, \*lf;
unsigned char \*ar\[14 \* sizeof(size_t) + 1\];
int i = 1;
ar\[0\] = head;
while(pshift \> 1) {
rt = head - width;
lf = head - width - lp\[pshift - 2\];
if(cmp(ar\[0\], lf, arg) \>= 0 && cmp(ar\[0\], rt, arg) \>= 0) {
break;
}
if(cmp(lf, rt, arg) \>= 0) {
ar\[i++\] = lf;
head = lf;
pshift -= 1;
} else {
ar\[i++\] = rt;
head = rt;
pshift -= 2;
}
}
cycle(width, ar, i);
}
static void trinkle(unsigned char \*head, size_t width,
git\_\_sort_r_cmp cmp, void \*arg, size_t pp\[2\], int pshift, int
trusty, size_t lp\[\])
{
unsigned char \*stepson,
\*rt, \*lf;
size_t p\[2\];
unsigned char \*ar\[14 \* sizeof(size_t) + 1\];
int i = 1;
int trail;
p\[0\] = pp\[0\];
p\[1\] = pp\[1\];
ar\[0\] = head;
while(p\[0\] != 1 \|\| p\[1\] != 0) {
stepson = head - lp\[pshift\];
if(cmp(stepson, ar\[0\], arg) \<= 0) {
break;
}
if(!trusty && pshift \> 1) {
rt = head - width;
lf = head - width - lp\[pshift - 2\];
if(cmp(rt, stepson, arg) \>= 0 \|\| cmp(lf, stepson, arg) \>= 0) {
break;
}
}
ar\[i++\] = stepson;
head = stepson;
trail = pntz(p);
shr(p, trail);
pshift += trail;
trusty = 0;
}
if(!trusty) {
cycle(width, ar, i);
sift(head, width, cmp, arg, pshift, lp);
}
}
/\*\*将代码中qsort_r() 替换为 qsort_r_wanghh() 的\*\*/
static void qsort_r_wanghh(void \*base, size_t nel, size_t width,
git\_\_sort_r_cmp cmp, void \*arg)
{
size_t lp\[12\*sizeof(size_t)\];
size_t i, size = width \* nel;
unsigned char \*head, \*high;
size_t p\[2\] = {1, 0};
int pshift = 1;
int trail;
if (!size) return;
head = base;
high = head + size - width;
/\* Precompute Leonardo numbers, scaled by element width \*/
for(lp\[0\]=lp\[1\]=width, i=2; (lp\[i\]=lp\[i-2\]+lp\[i-1\]+width) \<
size; i++);
while(head \< high) {
if((p\[0\] & 3) == 3) {
sift(head, width, cmp, arg, pshift, lp);
shr(p, 2);
pshift += 2;
} else {
if(lp\[pshift - 1\] \>= high - head) {
trinkle(head, width, cmp, arg, p, pshift, 0, lp);
} else {
sift(head, width, cmp, arg, pshift, lp);
}
if(pshift == 1) {
shl(p, 1);
pshift = 0;
} else {
shl(p, pshift - 1);
pshift = 1;
}
}
p\[0\] \|= 1;
head += width;
}
trinkle(head, width, cmp, arg, p, pshift, 0, lp);
while(pshift != 1 \|\| p\[0\] != 1 \|\| p\[1\] != 0) {
if(pshift \<= 1) {
trail = pntz(p);
shr(p, trail);
pshift += trail;
} else {
shl(p, 2);
pshift -= 2;
p\[0\] \^= 7;
shr(p, 1);
trinkle(head - lp\[pshift\] - width, width, cmp, arg, p, pshift + 1, 1,
lp);
shl(p, 1);
p\[0\] \|= 1;
trinkle(head - width, width, cmp, arg, p, pshift, 1, lp);
}
head -= width;
}
}
编译libgit2时报错:error: C++ style comments are not allowed in ISO C90

vim /opt/julia/julia-1.10.6/deps/libgit2.mk +16
LIBGIT2_OPTS := $(CMAKE_COMMON) -DCMAKE_BUILD_TYPE=Release -DUSE_THREADS=ON -DUSE_BUNDLED_ZLIB=ON -DUSE_SSH=ON -DBUILD_CLI=OFF -DCMAKE_C_FLAGS="-std=c99"
make -C deps clean-libgit2
编译libgit2时找不到头文件mbedtls/md.h
vim /opt/julia/julia-1.10.6/deps/libgit2.mk:

上面这一步貌似也可以不做,直接做下一步:
rm -rf deps/scratch/libgit2-a418d9d4ab87bae16b87d8f37143a4687ae0e4b2/
make
链接flisp时提示找不到libatomic.so.1库,加入环境变量即可:

export LD_LIBRARY_PATH=/opt/julia/julia-1.10.6/usr/lib
预编译0penBLAS jll时提示StackOverflowError:

vim julia-1.10.6/src/array.c +528\

编译完后再复原这段代码,再编译一遍
vim julia-1.10.6/stdlib/OpenBLAS_jll/src/OpenBLAS_jll.jl +50(C_NULL应改为nothing)

加上try...catch即可。
编译openblas时报:unknown value 'native' for '-march'

vim /opt/julia/julia-1.10.6/deps/openblas.mk +86
OPENBLAS_BUILD_OPTS += "MAKE_NB_JOBS=0 -march=armv8-a"
编译sys.so时报:Unmatchable platform string 'aarch64-linux-musleabi'!-cxx11-julia_version+1.10.6`

vim base/binaryplatforms.jl +693
#triplet = "aarch64-linux-musleabi-libgfortran5-cxx11-julia_version+1.10.6"
triplet = "aarch64-linux-musl-libgfortran5-cxx11-julia_version+1.10.6"
OHOS中没有HOME环境变量,以下代码需要修改:

编译patchelf时automake版本报错
cd /opt/julia/julia-1.10.6/deps/srccache/patchelf-0.13\ aclocal\ automake --add-missing
autoconf
然后重新编译
julia启动问题解决方法
启动脚本参考
#!/bin/sh
# package restored directory.
#export HOME=`pwd`/../home
# to find libjulia.so.
#export JULIA_LIB_DIR=`pwd`/../lib
# to find share directory relative to bin directory.
#export JULIA_BIN_DIR=`pwd`
export http_proxy=http://10.10.45.70:7897
export https_proxy=http://10.10.45.70:7897
#JULIA_PKG_SERVER=https://mirrors.pku.edu.cn/julia LD_LIBRARY_PATH=$JULIA_LIB_DIR ./julia -J $JULIA_LIB_DIR/sys.so -H $JULIA_BIN_DIR --color=yes
export JULIA_SSL_CA_ROOTS_PATH=/etc/ssl/certs/cacert.pem
HOME=`pwd`/../home JULIA_PKG_SERVER=https://mirrors.pku.edu.cn/julia ./julia --color=yes
禁用MUSL LOG
param set musl.log.enable=false
重新编译库
make -C deps clean-blastrampoline
make -C deps distclean-blastrampoline
make -C deps cleanall // distcleanall // uninstall
make cleanall //distcleanall
# 重新编译julia核心依赖库(libjulia-internal.so, libjulia-codegen.so)
make julia-src-release
# 强制所有deps目录所有库通过源码编译
vim Make.user:
USE_BINARYBUILDER := 0
重新编译julia镜像
make -s -C /opt/julia/julia-1.10.6 -f sysimage.mk sysimg-release
make -s -C /opt/julia/julia-1.10.6 -f pkgimage.mk release
其它相关
make -s -C /opt/julia/julia-1.10.6 -f sysimage.mk sysimg-release
/bin/sh -c printf ' %b %b\n' "\033[32;1m"JULIA"\033[0m" "\033[37;1m"usr/lib/julia/sys-o.a"\033[0m"; cd /opt/julia/julia-1.10.6/base && if ! JULIA_BINDIR=/opt/julia/julia-1.10.6/usr/bin WINEPATH="/opt/julia/julia-1.10.6/usr/bin;$WINEPATH" JULIA_LOAD_PATH='@stdlib' JULIA_PROJECT= JULIA_DEPOT_PATH=':' JULIA_NUM_THREADS=1 /opt/julia/julia-1.10.6/usr/bin/julia -O3 -C "generic;cortex-a57" --output-o /opt/julia/julia-1.10.6/usr/lib/julia/sys-o.a.tmp --startup-file=no --warn-overwrite=yes --sysimage /opt/julia/julia-1.10.6/usr/lib/julia/sys.ji /opt/julia/julia-1.10.6/contrib/generate_precompile.jl 1; then echo '*** This error is usually fixed by running `make clean`. If the error persists, try `make cleanall`. ***'; false; fi
/usr/libexec/qemu-binfmt/aarch64-binfmt-P /opt/julia/julia-1.10.6/usr/bin/julia /opt/julia/julia-1.10.6/usr/bin/julia -O3 -C generic;cortex-a57 --output-o /opt/julia/julia-1.10.6/usr/lib/julia/sys-o.a.tmp --startup-file=no --warn-overwrite=yes --sysimage /opt/julia/julia-1.10.6/usr/lib/julia/sys.ji /opt/julia/julia-1.10.6/contrib/generate_precompile.jl 1
JULIA_PRECOMPILE ?= 0 后
make -s -C /opt/julia/julia-1.10.6 -f sysimage.mk sysimg-ji JULIA_EXECUTABLE=/opt/julia/julia-1.10.6/usr/bin/julia
/bin/sh -c printf ' %b %b\n' "\033[32;1m"JULIA"\033[0m" "\033[37;1m"usr/lib/julia/sys.ji"\033[0m"; cd /opt/julia/julia-1.10.6/base && if ! JULIA_BINDIR=/opt/julia/julia-1.10.6/usr/bin WINEPATH="/opt/julia/julia-1.10.6/usr/bin;$WINEPATH" /opt/julia/julia-1.10.6/usr/bin/julia -g1 -O0 -C "generic;cortex-a57" --output-ji /opt/julia/julia-1.10.6/usr/lib/julia/sys.ji.tmp --startup-file=no --warn-overwrite=yes --sysimage /opt/julia/julia-1.10.6/usr/lib/julia/corecompiler.ji sysimg.jl ./ ; then echo '*** This error might be fixed by running `make clean`. If the error persists, try `make cleanall`. ***'; false; fi
/usr/libexec/qemu-binfmt/aarch64-binfmt-P /opt/julia/julia-1.10.6/usr/bin/julia /opt/julia/julia-1.10.6/usr/bin/julia -g1 -O0 -C generic;cortex-a57 --output-ji /opt/julia/julia-1.10.6/usr/lib/julia/sys.ji.tmp --startup-file=no --warn-overwrite=yes --sysimage /opt/julia/julia-1.10.6/usr/lib/julia/corecompiler.ji sysimg.jl ./
编译JULIA包
using Pkg
Pkg.build("IJulia")
启动时不加载预编译的包
julia --compiled-modules=no # 启动时不加载任何包的预编译缓存
此时导入包(如 using DataFrames)会重新编译该包,而非使用缓存的 .ji 文件。
启动时输出包加载调试信息
JULIA_DEBUG=loading ./julia
将stdlib下面的包编译进sys.so
vim /opt/julia/julia-1.10.6/base/sysimg.jl:
# Stdlibs sorted in dependency, then alphabetical, order by contrib/print_sorted_stdlibs.jl
# Run with the `--exclude-jlls` option to filter out all JLL packages
stdlibs = [
# No dependencies
:ArgTools,
:Artifacts,
:Base64,
:CRC32c,
:FileWatching,
:Libdl,
:Logging,
:Mmap,
:NetworkOptions,
:SHA,
:Serialization,
:Sockets,
:Unicode,
# 1-depth packages
:LinearAlgebra,
:Markdown,
:Printf,
:Random,
:Tar,
# 2-depth packages
:Dates,
:Future,
:InteractiveUtils,
:LibGit2,
:UUIDs,
# 3-depth packages
:REPL,
:TOML,
# 4-depth packages
:LibCURL,
# 5-depth packages
:Downloads,
# 6-depth packages
:Pkg,
:Test, #add by wanghh 2025.10.29
]
JULIA通过源码安装模块
-
通过命令安装:在RELP中输入:], dev 源码路径
-
通过脚本安装:
push!(LOAD_PATH, "/data/storage/el2/base/haps/entry/files/MyTest0918")
-
直接将源码MyTest0918放在LOAD_PATH路径下,然后加入到LOAD_PATH:
push!(LOAD_PATH,"/data/storage/el1/bundle/entry/resources/resfile/share/julia/stdlib/v1.10")
Julia源码修改
修改libjulia.so查找依赖库的路径从lib/julia到lib目录(所有的库都在libjulia.so同一目录)
vim Makefile +459:

无法加载BLAS库

export LBT_DEFAULT_LIBS=libopenblas64_.so
或vim deps/scratch/blastrampoline-05083d50611b5538df69706f0a952d8e642b0b4b/src/libblastrampoline_internal.h +45
#define LBT_FALLBACK_LIBS "libopenblas64_.so"
make -C deps clean-blastrampoline
make
Julia启动时报加载库乱码错误

vim deps/scratch/blastrampoline-05083d50611b5538df69706f0a952d8e642b0b4b/src/dl_utils.c +30:

vim deps/scratch/blastrampoline-05083d50611b5538df69706f0a952d8e642b0b4b/src/libblastrampoline.c +226:

vim stdlib/OpenBLAS_jll/src/OpenBLAS_jll.jl +43


跟踪动态库的加载过程
vim src/dlload.c +262:

跟踪包的加载过程
vim src/toplevel.c +65:

修改/proc/cpuinfo文件读取路径
find . -type f \( -name "*.c" -o -name "*.cc" -o -name "*.cpp" -o -name "*.h" -o -name "*.jl" \) | xargs sed -i 's@/proc/cpuinfo@/data/storage/el2/base/haps/entry/files/cpuinfo@g'
签名precompile新生成的SO
修改/opt/julia/julia-1.10.6/base/linking.jl中的link_image()函数:
function link_image(path, out, internal_stderr::IO=stderr, internal_stdout::IO=stdout)
run(link_image_cmd(path, out), Base.DevNull(), internal_stderr, internal_stdout)
#add by wanghh 2026.3.31
SIGN_PATH = get(ENV, "JULIA_SIGN_PATH", "")
if !isempty(SIGN_PATH)
SIGN_OUT = string(out, ".sign")
SIGN_CMD = `$SIGN_PATH sign -inFile $out -outFile $SIGN_OUT -selfSign 1`
SIGN_CLEAN = `cp -rf $SIGN_OUT $out`
println("====> link_image(", \@__LINE__, "): ", SIGN_CMD)
run(SIGN_CMD, Base.DevNull(), internal_stderr, internal_stdout)
run(SIGN_CLEAN, Base.DevNull(), internal_stderr, internal_stdout)
end
end
以下修改废弃========================================================
修改/opt/julia/julia-1.10.6/src/staticdata.c中的jl_restore_package_image_from_file()函数:
// 只有设置了环境变量JULIA_SIGN_PATH签名机制才生效,如:JULIA_SIGN_PATH=/data/service/hnp/julia.org/julia_2.10.9/bin/binary-sign-tool
// 环境变量JULIA_SIGN_DIR_PATH用于匹配需要签名的SO路径,默认在沙箱路径下面新生成的SO都会被签名
//
JL_DLLEXPORT jl_value_t *jl_restore_package_image_from_file(const char *fname, jl_array_t *depmods, int completeinfo, const char *pkgname)
{
// add by wanghh 2025.9.24
// add sign for so.
//
char* fname_new = NULL;
char* sign_cmd = NULL;
const char* fname_switch = fname;
do
{
char* sign_path_env = getenv("JULIA_SIGN_PATH");
if(NULL == sign_path_env || 0 != file_exists(sign_path_env))
break;
printf("====%s:%d: fname:%s; pkgname: %s; sign tools path: %s;\n",__FUNCTION__,__LINE__, fname, pkgname, sign_path_env);
// enable sign tools.
char sign_dir_base[] = "/data/storage/el2/base/haps/entry/files";
char* sign_dir_env = getenv("JULIA_SIGN_DIR_PATH");
if(NULL != strstr(fname, sign_dir_base) || (NULL != sign_dir_env && (NULL != strstr(fname, sign_dir_env))))
{
// path matched.
int fname_new_size = strlen(fname) + 64;
fname_new = (char*)malloc(fname_new_size);
if(NULL == fname_new)
{
printf("====%s:%d: malloc(%d) failure.\n",__FUNCTION__,__LINE__, fname_new_size);
break;
}
snprintf(fname_new,fname_new_size,"%s.1", fname);
fname_new[fname_new_size-1] = 0;
// copy file if not exist.
if(0 != file_exists(fname_new))
{
printf("====%s:%d: copy %s to %s...\n",__FUNCTION__,__LINE__, fname, fname_new);
if(0 != copy_file_fopen(fname, fname_new))
{
printf("====%s:%d: copy(%s->%s) failure.\n",__FUNCTION__,__LINE__, fname, fname_new);
break;
}
// start sign at first time.
int sign_cmd_size = strlen(sign_path_env) + strlen(fname_new) + strlen(fname) + 128;
sign_cmd = (char*)malloc(sign_cmd_size);
if(NULL == sign_cmd)
{
printf("====%s:%d: malloc(%d) failure.\n",__FUNCTION__,__LINE__, sign_cmd_size);
break;
}
snprintf(sign_cmd, sign_cmd_size, "%s sign -inFile \"%s\" -outFile \"%s\" -selfSign \"1\"", sign_path_env, fname, fname_new);
sign_cmd[sign_cmd_size-1] = 0;
printf("====%s:%d: %s ...\n",__FUNCTION__,__LINE__, sign_cmd);
system(sign_cmd);
}
fname_switch = fname_new;
printf("====%s:%d: dlopen signed so: %s...\n",__FUNCTION__,__LINE__, fname_switch);
}
} while (false);
void *pkgimg_handle = jl_dlopen(fname_switch, JL_RTLD_LAZY);
if(NULL != fname_new)
{
free(fname_new);
fname_new = NULL;
}
if(NULL != sign_cmd)
{
free(sign_cmd);
sign_cmd = NULL;
}
fname_switch = NULL;
//void *pkgimg_handle = jl_dlopen(fname, JL_RTLD_LAZY);
if (!pkgimg_handle) {
#ifdef _OS_WINDOWS_
int err;
char reason[256];
err = GetLastError();
win32_formatmessage(err, reason, sizeof(reason));
#else
const char *reason = dlerror();
#endif
jl_errorf("Error opening package file %s: %s\n", fname, reason);
}
const char *pkgimg_data;
jl_dlsym(pkgimg_handle, "jl_system_image_data", (void **)&pkgimg_data, 1);
size_t *plen;
jl_dlsym(pkgimg_handle, "jl_system_image_size", (void **)&plen, 1);
jl_image_t pkgimage = jl_init_processor_pkgimg(pkgimg_handle);
jl_value_t* mod = jl_restore_incremental_from_buf(pkgimg_handle, pkgimg_data, &pkgimage, *plen, depmods, completeinfo, pkgname, false);
return mod;
}
SECCOMP错误:Signal:SIGSYS(SYS_SECCOMP) syscall number is 1008
vim /opt/julia/julia-1.10.6/src/partr.c +213

rrcall_check的作用:
用于判断当前Julia进程是否正在 rr调试器(Record and Replay Debugger)环境下运行。它主要服务于Julia的调试和故障复现机制,帮助开发者在调试场景中动态调整程序行为。
rr调试器仅支持Linux系统,因此rrcall_check在Windows或macOS上返回false。
修改aarch64-linux-musleabi去掉eabi
vim Make.inc:
BUILD_MACHINE := $(shell $(HOSTCC) -dumpmachine | sed 's/musleabi/musl/')
去掉加载预编译SO时的Target检查
vim src/processor.cpp + 870:

vim base/loading.jl +3041:

原生编译
编译GMP时conftest找不到libstdc++.so.6
实际上是conftest在运行时没有设置rpath
vim deps/srccache/gmp-6.2.1/configure +10503:
需要修改以下三个地方
echo "Test compile: " >&5
echo "Test compile: namespace" >&5
echo "Test compile: std iostream" >&5
对应的:
gmp_cxxcompile="$CXX $CPPFLAGS $CXXFLAGS -Wl,-rpath,/opt/julia/julia-1.10.6/usr/lib conftest.cc >&5"


flisp无法加载libatomic.so.1
patchelf --set-rpath \$ORIGIN:/opt/julia/julia-1.10.6/usr/lib src/flisp/flisp
JULIA IDE启动
using Pkg; Pkg.add("Pluto")
using Pluto; Pluto.run()



修复Pluto编译错误(OpenSSL_jll不识别平台aarch64-linux-musleabi):
cd /opt/julia/julia-1.10.6/install/opt/julia/julia-1.10.6/julia-1.10.6/home/.julia/packages/OpenSSL_jll/5e9Kp/src/wrappers
cp x86_64-w64-mingw32.jl x86_64-w64-mingw32.jl.bak
cp aarch64-linux-musl.jl x86_64-w64-mingw32.jl
重新编译:Pkg.precompile()
aarch64-linux-musleabi的来源:

Vim base/Makefile +47

vim Make.inc +809


更多推荐


所有评论(0)