编译背景

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通过源码安装模块

  1. 通过命令安装:在RELP中输入:], dev 源码路径

  2. 通过脚本安装:

    push!(LOAD_PATH, "/data/storage/el2/base/haps/entry/files/MyTest0918")

  3. 直接将源码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

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐