一、GLIBC版本兼容性问题
1.1 问题描述
GLIBC(GNU C Library) 是Linux系统中最底层的核心库。用高版本GLIBC编译的程序,无法在安装低版本GLIBC的系统上运行。

1.2 问题现象

touch: symbol lookup error: /opt/vrte/usr/lib/libc.so.6: undefined symbol: _dl_audit_symbind_alt, version GLIBC_PRIVATE
1.3 根本原因
-
工具链GLIBC版本:2.34(编译程序时使用)
-
车载ECU BSP的GLIBC版本:2.32(目标系统实际版本)
-
系统信息:
root@s32g3-tpf-platform:/opt/vrte/usr/bin# uname -a Linux s32g3-tpf-platform 5.10.120-rt70+g0b76731696c1 #1 SMP PREEMPT Mon Sep 12 13:23:16 UTC 2022 aarch64 GNU/Linux
1.4 解决方案
patchelf rb-exmd --set-interpreter /opt/vrte/usr/lib/ld-linux-aarch64.so.1
将高版本的库存放到 /opt/vrte/usr/lib目录下

核心思路 :调整环境变量设置顺序,只让RTA-VRTE自身的应用程序(如rb-exmd)加载/opt/vrte的库,而不污染整个shell的标准系统命令。
二、修正后的exmd.sh脚本
2.1 完整脚本
bash
bash
#!/bin/sh
# default timeout argument for exmd (milliseconds)
exmd_timeout="60000"
# Define color codes
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'
echo -e "${YELLOW}\n**************************************************"
echo -e "*** Welcome to the RTA-VRTE ***"
echo -e "**************************************************${NC}\n"
echo -e "${YELLOW}This utility serves as the launching for the RTA-VRTE platform. It facilitates the configuration of ENVIRONMENT VARIABLES and initiates the Execution Management tailored to your specified settings.${NC}"
IPC_PATH="/opt/vrte/tmp/dlt"
# --- 1. 在没有污染LD_LIBRARY_PATH之前,安全地执行系统命令清除残留 ---
if [ -d "$IPC_PATH" ]; then
echo -e "${YELLOW}Cleaning the DLT cache/pipes folder defined by IPC_PATH env. This action has to be done at every target startup.${NC}"
echo -e "\n"
rm -rf "$IPC_PATH" # 此时rm会正常工作
fi
mkdir -p -m 777 "$IPC_PATH"
export ECUCFG_ENV_VAR_ROOTFOLDER=/opt/vrte/exm-aap-execution-manager/etc/ecu-cfg
export PROCESSIDENTIFIER=rb_exmd
export DLT_PIPE_DIR=$IPC_PATH
# 此时运行touch,依然使用的是系统自带的C库,能够成功执行
touch /tmp/dlt-runtime-application.cfg
touch /tmp/dlt-runtime-context.cfg
touch /tmp/dlt-runtime.cfg
echo -e "${GREEN}*** DLT_PIPE_DIR configured to... ***${NC}"
env | grep DLT_PIPE_DIR
echo -e "${GREEN}***\n${NC}"
echo -e "${GREEN}*** (exm__<softwareclustername>_flatcfg.bin) is stored into ECUCFG_ENV_VAR_ROOTFOLDER ***${NC} "
env | grep ECUCFG_ENV_VAR_ROOTFOLDER
echo -e "${GREEN}***\n${NC}"
echo -e "${GREEN}*** PROCESSIDENTIFIER configured to... ***${NC}"
env | grep PROCESSIDENTIFIER
echo -e "${GREEN}***\n${NC}"
# --- 2. 局部应用库路径,仅供rb-exmd启动时使用,不全局污染 ---
export VRTE_LD_PATH="/opt/vrte/usr/lib:/opt/vrte/lib"
echo -e "${GREEN}*** LD_LIBRARY_PATH used by EXMD ***${NC} "
echo -e "Target path: ${VRTE_LD_PATH}:${LD_LIBRARY_PATH}"
echo -e "${GREEN}***\n${NC}"
echo -e "${YELLOW}Starting Execution Management... (/opt/vrte/exm-aap-execution-manager/bin/rb-exmd) ${NC}"
# 在启动rb-exmd的这一行,将库路径传给它,防止影响其他命令
LD_LIBRARY_PATH="${VRTE_LD_PATH}:${LD_LIBRARY_PATH}" /opt/vrte/exm-aap-execution-manager/bin/rb-exmd -t "$exmd_timeout" &
2.2 关键修改点解析
| 修改点 | 说明 |
|---|---|
| 延迟/局部设置LD_LIBRARY_PATH | 去掉全局的export LD_LIBRARY_PATH,只在最后启动rb-exmd时,使用行内前缀形式赋予环境变量 |
| 保护系统命令 | 确保前面的rm、mkdir、touch、grep等基础命令全部链接到S32G3原生系统库 |
| 不污染Shell环境 | 只影响rb-exmd进程,不影响其他命令执行 |
三、DLT冲突问题
3.1 问题描述
Linux BSP已经集成了一套完整的COVESA DLT(dlt-system + dlt-daemon),而ETAS VRTE的EXM配置(FlatCfg)仍然保留了一个DLT Process,导致同一台ECU上启动了两套DLT,产生冲突。

3.2 冲突现象
bash
root@s32g3-tpf-platform:~# ps -ef | grep dlt
root 267 1 0 18:25 ? 00:00:00 /usr/bin/dlt-system
root 271 1 0 18:25 ? 00:00:00 /usr/bin/dlt-daemon
root 396 375 0 18:26 pts/0 00:00:00 grep dlt
3.3 解决方案
方案一:永久禁用BSP自带的DLT(推荐)
如果板子始终运行RTA-VRTE,建议直接禁止BSP自动启动DLT:
bash
# 禁用DLT服务
systemctl disable dlt.service
systemctl disable dlt-system.service
# 确认禁用状态
systemctl list-unit-files | grep dlt
执行结果:
bash
root@s32g3-tpf-platform:~# systemctl list-unit-files | grep dlt dlt-adaptor-udp.service disabled disabled dlt-example-user.service static - dlt-receive.service static - dlt-system.service enabled enabled dlt.service enabled enabled
重启后检查:
bash
ps -ef | grep dlt # 应无 /usr/bin/dlt-daemon 和 /usr/bin/dlt-system 进程 # 此时rb-dltd可以正常启动
方案二:启动前停止系统DLT服务
在exmd.sh中添加:
bash
systemctl stop dlt.service systemctl stop dlt-system.service
3.4 最佳实践建议
对于RTA-VRTE + Adaptive AUTOSAR 环境,不建议在exmd.sh中每次都kill -9系统进程。更合理的做法是:
-
一次性配置 :
systemctl disable dlt.service和dlt-system.service -
启动前清理 :
systemctl stop dlt.service和dlt-system.service -
启动VRTE :
./exmd.sh启动rb-exmd
四、总结
| 问题类型 | 根本原因 | 解决方案 |
|---|---|---|
| GLIBC版本不兼容 | 工具链GLIBC 2.34 vs BSP GLIBC 2.32 | 局部设置LD_LIBRARY_PATH,只影响VRTE应用 |
| DLT服务冲突 | BSP自带DLT与VRTE的rb-dltd冲突 | 禁用BSP的dlt.service和dlt-system.service |
验证步骤
-
应用修正后的exmd.sh脚本
-
禁用BSP自带的DLT服务
-
重启系统验证
-
检查DLT进程状态和VRTE日志输出