[问题记录]编译AArch64平台的sigar源码遇到的问题

因为平台使用了sigar来获取系统信息,在国产化平台下(华为鲲鹏CPU、UOS系统)需要重新编译得到aarch64对应的so依赖文件[libsigar-aarch64-linux.so]。以下是编译中遇到的问题,这些问题在sigar源码的Issues里都有回答,只是源码没有再维护更新了而已。

编译环境

/home/sigar# uname -a
Linux xxx-PC 4.19.0-arm64-desktop #1705 SMP Wed Mar 25 18:04:38 CST 2020 aarch64 GNU/Linux

/home/sigar#java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b01-1~deb9u1-b01)
OpenJDK 64-Bit Server VM (build 25.212-b01, mixed mode)

(一)编译

编译的命令是在sigar源码的bindings/java路径下使用ant命令编译

/home/sigar# cd bindings/java/
/home/sigar/bindings/java# ant

(二)编译失败

使用ant编译后报错,报错信息截取如下:

jni-cc:
    [mkdir] Created dir: /home/sigar/bindings/java/build/obj/aarch64-linux/lib
     [echo] jni libname=sigar-aarch64-linux
       [cc] 13 total files to be compiled.
       [cc] gcc: error: unrecognized command line option ‘-m64’

BUILD FAILED
/home/sigar/bindings/java/hyperic_jni/jni-build.xml:224: The following error occurred while executing this line:
/home/sigar/bindings/java/hyperic_jni/jni-build.xml:270: gcc failed with return code 1

Total time: 3 seconds

解决方案
参照Issuse 104中vielmetti 提供的修改内容
修改sigar/bindings/java/hyperic_jni/src/org/hyperic/jni/ArchNameTask.java78行的代码

if (ArchLoader.IS_LINUX) {
    if (!osArch.equals("ia64") 
        && !osArch.equals("aarch64")) {
        getProject().setProperty("jni.gccm", "-m64");
    }
}

避免在aarch64中引入-m64参数

再次使用ant命令编译,至此应该编译成功。so文件生成在sigar/bindings/java/sigar-bin/lib文件夹下,但是在使用时仍然有些问题。

(三)版本不匹配

运行时提示

minor version mismatch: (6!=7) java=1.6.6.0, native=1.7.0.0
org.hyperic.sigar.SigarException: minor version mismatch: (6!=7) java=1.6.6.0, native=1.7.0.0
        at org.hyperic.sigar.Sigar.checkVersion(Sigar.java:147)
        at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:106)
        at com.grgbanking.hyi9.listenerdemo.FileTest.f19(FileTest.java:82)
        at com.grgbanking.hyi9.listenerdemo.FileTest.main(FileTest.java:51)

使用sigar的master分支编译出的libsigar-aarch64-linux.so文件对应的sigar版本是1.7。而我们下载的编译好的sigar一般是1.6。
如果要使用已有的1.6版本,则需要使用sigar1.6分支源码进行编译得到的libsigar-aarch64-linux.so文件。
如果想要使用master分支编译的so文件,则需要上一步编译成功后sigar/bindings/java/sigar-bin/lib文件夹下的sigar.jar文件。

(四)运行异常

运行时提示

java: symbol lookup error: /xxx/xxx/libsigar-aarch64-linux.so: undefined symbol: sigar_skip_token

参照Issuse 60中提供的解决方案,在https://github.com/hyperic/sigar/blob/sigar-1.6/bindings/java/hyperic_jni/jni-build.xml326行后插入

<compilerarg value="-fgnu89-inline"/>

(五)其他

在最初编译时可能因为系统环境问题,出现了"error: called object ‘XXXX’ is not a function or function pointer"异常,错误提示如下:

/home/sigar/src/os/linux/linux_sigar.c:1177:22: error: called object ‘major’ is not a function or function pointer
 #define ST_MAJOR(sb) major((sb).st_rdev)
                      ^~~~~
/home/sigar/src/os/linux/linux_sigar.c:1266:23: note: in expansion of macro ‘ST_MAJOR’
         if ((major == ST_MAJOR(sb)) &&
                       ^~~~~~~~
/home/sigar/src/os/linux/linux_sigar.c:1261:23: note: declared here
         unsigned long major, minor;
                       ^~~~~
/home/sigar/src/os/linux/linux_sigar.c:1178:22: error: called object ‘minor’ is not a function or function pointer
 #define ST_MINOR(sb) minor((sb).st_rdev)
                      ^~~~~

这部分可能与编译方式以及编译环境有关,最开始使用的是cmake编译,java版本也感觉不大正常,换了一台机器并且使用ant编译后就没有遇到这个问题,有点奇怪。

编译使用的系统及CPU信息如下

操作系统内核信息

xxx@xxx-PC:~$ uname -a
Linux xxx-PC 4.19.0-arm64-desktop #1705 SMP Wed Mar 25 18:04:38 CST 2020 aarch64 GNU/Linux

显示发行版本信息

xxx@xxx-PC:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Uos
Description:    uos 20 SP1
Release:        20 SP1
Codename:       n/a

操作系统版本信息

xxx@xxx-PC:~$ cat /proc/version
Linux version 4.19.0-arm64-desktop (deepin@deepin-PC) (gcc version 8.3.0 (Debian 8.3.0-6)) #1705 SMP Wed Mar 25 18:04:38 CST 2020

CPU信息

xxx@xxx-PC:~$ cat /proc/cpuinfo
processor       : 0
model name      : HUAWEI Kunpeng 920 1229K
BogoMIPS        : 200.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm
CPU implementer : 0x48
CPU architecture: aarch64
CPU variant     : 0x1
CPU part        : 0xd01
CPU revision    : 0

processor       : 1
model name      : HUAWEI Kunpeng 920 1229K
BogoMIPS        : 200.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm
CPU implementer : 0x48
CPU architecture: aarch64
CPU variant     : 0x1
CPU part        : 0xd01
CPU revision    : 0

processor       : 2
model name      : HUAWEI Kunpeng 920 1229K
BogoMIPS        : 200.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm
CPU implementer : 0x48
CPU architecture: aarch64
CPU variant     : 0x1
CPU part        : 0xd01
CPU revision    : 0

processor       : 3
model name      : HUAWEI Kunpeng 920 1229K
BogoMIPS        : 200.00
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm
CPU implementer : 0x48
CPU architecture: aarch64
CPU variant     : 0x1
CPU part        : 0xd01
CPU revision    : 0

重新编译后,使用得到的so文件,在系统里已经能够获取硬件信息。
修改后的源码放在https://github.com/theodore26/sigar,编译后的libsigar-aarch64-linux.so和sigar.jar在https://download.csdn.net/download/theodore26/12411082
如果缺少aarch64平台的编译环境,可以在华为云上注册新账号然后申请1个月的云服务器试用,我之前申请到的就是aarch64平台的环境(购买的1年华为云反而是X86架构的),也可以编译成功,不过之后没有测试编译出的结果,理论上应该是一样的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章