---
title: 如何编译ARM 64版本ExaGear Strace补丁
description: "如何在部署了ExaGear的环境下，通过交叉编译的方式，从源码构建出ARM 64版本的 Strace ？"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcps/faqs/faq/kunpengcps_10_0005.html
sourcePath: /source/zh/kunpengcps/faqs/faq/kunpengcps_10_0005.html
indexId: a1cc64ed4e9b92abab4bf0eb031a20227eb0ace9e989db0980eecb1a1cc2184254
---
# 如何编译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官网编译工具链页面(https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads)下载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. 设置环境变量。

  a. 将交叉编译工具链的路径添加到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工具链默认为系统源安装。

  b. 设置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(https://github.com/strace/strace/releases/download/v4.25/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
