鲲鹏社区首页
中文
注册
开发者
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

如何编译ARM 64版本ExaGear Strace补丁

问题

如何在部署了ExaGear的环境下,通过交叉编译的方式,从源码构建出ARM 64版本的Strace

回答

用户可以使用工具链编译Strace V4.25源码及对应patch得到ARM 64 Strace可执行程序。编译步骤如下。

  1. 准备编译环境。

    按照表1表2所列要求准备编译环境。

    表1 硬件要求

    项目

    要求

    服务器架构

    x86_64

    CPU

    Intel® Xeon® CPU E5-2690 v2 @ 3.00GHz及以上

    内存容量

    大于等于1GB

    硬盘容量

    大于等于4GB

    表2 软件要求

    项目

    要求

    OS

    CentOS 7.6、Ubuntu18.0.4及以上

    操作系统用户

    普通用户

    GNU Make

    4.3及以上

    GCC

    7.5.0及以上

  2. ARM官网编译工具链页面下载Linaro交叉编译工具链(文件名:gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz):
  3. 将下载的文件上传到“/root”目录中并解压。
    1
    2
    cd /root
    tar xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
    
  4. 设置环境变量。
    1. 将交叉编译工具链的路径添加到PATH,并将isl库所在的目录加到LD_LIBRARY_PATH。
      1
      export PATH=/root/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/libexec/gcc/aarch64-none-linux-gnu/10.2.1:/root/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin:$PATH
      
      1
      export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
      

      如果本地GCC工具链不是通过系统源(yum、apt)安装,请执行4.b。如果是,则忽略4.b。GCC工具链默认为系统源安装。

    2. 设置GCC工具链的环境变量。
      1
      2
      export PATH=/home/lei/mpi_x86/gcc-9.3.0/bin:/usr/libexec/gcc/x86_64-redhat-linux/9.3.0:$PATH
      export LD_LIBRARY_PATH=/home/lei/mpi_x86/gcc-9.3.0/lib64:/usr/libexec/gcc/x86_64-redhat-linux/9.3.0:$LD_LIBRARY_PATH
      
  5. 下载Strace源码strace-4.25.tar.xz
  6. 在root目录下新建一个strace.patch。
    cd /root
    vim strace.patch
  7. 将如下内容拷贝到strace.patch文件中并保存。
    diff --git a/linux/aarch64/get_scno.c b/linux/aarch64/get_scno.c
    index 350f32fb..0ed956dd 100644
    --- a/linux/aarch64/get_scno.c
    +++ b/linux/aarch64/get_scno.c
    @@ -1,3 +1,5 @@
    +static bool have_syscall_hack = false;
    +
     /* Return codes: 1 - ok, 0 - ignore, other - error. */
     static int
     arch_get_scno(struct tcb *tcp)
    @@ -8,11 +10,20 @@ arch_get_scno(struct tcb *tcp)
    		case sizeof(aarch64_regs):
    			/* We are in 64-bit mode */
    			scno = aarch64_regs.regs[8];
    +			if (scno & 0x80000000) {
    +				have_syscall_hack = true;
    +				update_personality(tcp, 1);
    +				scno = aarch64_regs.regs[7];
    +				scno = shuffle_scno(scno);
    +				break;
    +			}
    +			have_syscall_hack = false;
    			break;
    		case sizeof(arm_regs):
    			/* We are in 32-bit mode */
    			/* Note: we don't support OABI, unlike 32-bit ARM build */
    			scno = arm_regs.ARM_r7;
    +			have_syscall_hack = false;
    			break;
    	}
    
    diff --git a/linux/aarch64/get_syscall_args.c b/linux/aarch64/get_syscall_args.c
    index ea6e497d..96b2d404 100644
    --- a/linux/aarch64/get_syscall_args.c
    +++ b/linux/aarch64/get_syscall_args.c
    @@ -6,7 +6,7 @@
     static int
     get_syscall_args(struct tcb *tcp)
     {
    -	if (tcp->currpers == 1)
    +	if (tcp->currpers == 1 && !have_syscall_hack)
    		return arm_get_syscall_args(tcp);
    	tcp->u_arg[0] = aarch64_regs.regs[0];
    	tcp->u_arg[1] = aarch64_regs.regs[1];
    diff --git a/syscall.c b/syscall.c
    index fe85b8bf..9eac619a 100644
    --- a/syscall.c
    +++ b/syscall.c
    @@ -286,8 +286,8 @@ update_personality(struct tcb *tcp, unsigned int personality)
    	tcp->currpers = personality;
    
    	if (!qflag) {
    -		error_msg("[ Process PID=%d runs in %s mode. ]",
    -			  tcp->pid, personality_names[personality]);
    +//		error_msg("[ Process PID=%d runs in %s mode. ]",
    +//			  tcp->pid, personality_names[personality]);
    	}
    
    	if (need_mpers_warning[personality]) {
    
  8. strace-4.25.tar.xz上传到“/root”目录下,解压源码包后合入patch文件。
    1
    2
    3
    4
    cd /root
    tar xvf strace-4.25.tar.xz
    cd strace-4.25/
    patch -p1 < ../strace.patch
    

    解压过程中,若遇到如下问题:

    1
    tar xvf strace-4.25.tar.xz
    
    1
    2
    xz: /usr/local/lib/liblzma.so.5: version 'XZ_5.1.2alpha' not found (required by xz)
    xz: /usr/local/lib/liblzma.so.5: version 'XZ_5.2.2' not found (required by xz)
    

    可创建相关的符号链解决,如下:

    1
    2
    3
    Fix above issue:
    cd /usr/local/lib/
    ln -s -f /lib64/liblzma.so.5.2.2 liblzma.so.5
    
  9. 配置Strace源码树。
    1
    ./configure --enable-mpers=no --host=aarch64-none-linux-gnu LDFLAGS="-static -pthread"
    
  10. 编译安装Strace补丁。
    1
    2
    3
    cd strace-4.25/
    make
    make install exec_prefix=/root/strace_installation
    

    Strace生成路径如下:

    1
    /root/strace_installation/bin