解决xts执行ActsToolChainTest失败

1.关键字

ActsToolChainTest;getauxval;open;xts;

2.问题描述

xts在执行方舟工具链 ActsToolChainTest 套件时,
third_party/musl/libc-test/src/functionalext/supplement/fcntl/open 及
third_party/musl/libc-test/src/functionalext/supplement/misc/getauxval 套件执行失败。其中 Open 套件执行时,int fd = open(path, O_RDONLY + O_CREAT); 返回 fd 为3 非期待值4。getauxval 套件 getauxval_0300 执行失败,getauxval 返回 0 。

3.问题原因

3.1 正常机制

open()返回4;
getauxval()返回非0;

3.2 异常机制

open()返回3;
getauxval()返回0;

4.解决方案

4.1 open()失败分析

针对open()返回3,可以在rk3568中使用shell命令查看fd描述符的使用情况:

ls -l /proc/$$/fd //查看当前进程使用的文件描述符

echo $$ //查看当前进程

ps -ef | grep $$

查找当前进程的父进程,可以看到rk3568文件描述符3在hdcd中使用
由于在oh系统中,文件描述符是一种用于标识和操作文件或其他I/O资源的整数。文件描述符0、1、2是预留给标准输入、标准输出和标准错误输出的文件描述符。所以open()函数返回4,用例已经写成固定值4;针对于不同于rk3568的情况,涉及到后续的设备兼容情况,修改xts用例。

4.2 getauxval_0300() 失败分析

针对getauxval_0300()返回0的情况,third_party\musl\libc-test\src\functionalext\supplement\misc\getauxval.c对于源码进行查看:
void getauxval_0300(void)
{
unsigned long int result;
result = getauxval(AT_SYSINFO_EHDR);
EXPECT_TRUE("getauxval_0300", result != 0);
}
发现是在获取AT_SYSINFO_EHDR这个值:AT_SYSINFO_EHDR是一个系统调用参数,用于获取当前进程的ELF头信息。ELF(Executable and Linkable Format)是一种可执行文件格式,常用于Linux和Unix系统中。AT_SYSINFO_EHDR参数可以用于获取当前进程的ELF头信息,包括程序入口地址、程序头表、节区头表等信息。这些信息对于程序的调试和运行都非常重要。

要在Linux 64位系统中获取AT_SYSINFO_EHDR的值,需要内核打开CONFIG_IA32_EMULATION和CONFIG_COMPAT两个开关。

CONFIG_IA32_EMULATION选项允许64位内核在32位模式下运行,以便支持32位应用程序。而CONFIG_COMPAT选项则允许内核在64位模式下运行32位应用程序,并提供了一些兼容性支持。

AT_SYSINFO_EHDR是一个特殊的辅助向量,它包含了一个指向系统调用接口的ELF头部的指针。这个指针可以用来确定系统调用的入口点,从而在64位系统上运行32位应用程序时,可以正确地调用系统调用。

因此,要获取AT_SYSINFO_EHDR的值,需要确保内核已经打开了CONFIG_IA32_EMULATION和CONFIG_COMPAT两个选项。
举个例子可以使用shell命令 查看 是否开启:
zcat /proc/config.gz | grep CONFIG_IA32_EMULATION

例如:输出结果为 CONFIG_IA32_EMULATION=y,则表示该内核开关已经打开。

还有其他相关的内核:
CONFIG_PROC_PAGE_MONITOR 和 CONFIG_ELF_CORE,CONFIG_PROC_FS;

5.定位过程

  • 设备环境
    板子型号:rk3566
    源码版本:码云社区3.2Rlease
    windows系统中python版本:3.8 以上
    源码编译系统:linux系统或者ubuntu系统

  • XTS测试步骤

  1. 码云社区下载最新OpenHarmony 3.2Release源码:
  2. 在OpenHarmony 3.2Release源码根目录下,cd test/xts/acts
  3. 编译acts:./build.sh product_name=rk3568 system_size=standard
  4. 将编译生成OpenHarmony_3.2Re\out\rk3568\suites\acts 目录拷贝到windows系统下;
  5. 修改xts\acts\config目录下的user_config.xml,
    ip:127.0.0.1
    port:8710
    sn:xxxxxxxxxxxx //hdc list targets 查看sn号,填入;
  6. 然后执行acts目录下run.bat脚本,脚本执行成功后,单独测试:run -l ActsToolChainTest

6.知识分享

1.不同的设备可能open函数返回的文件描述符会不一样,这一点需要自己调试一下。
2.getauxval()根据参数的不同,获取进程信息也会有所差别,这一点内核配置相关。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐