609 字
3 分钟
[海思 3519DV500] SDK 调试与编译配置

本文记录了在调试 mpp/sample/venc/sample_venc.c 过程中,如何解决 Git 忽略文件缺失、开启 GDB 调试支持以及绕过海思 SDK 强制安全编译选项(Strip 符号表)的完整过程。


0. Git 环境初始化与修复#

背景

在 Git 初始化后忘记添加 .gitignore,导致大量编译产物(.o, .ko, .so)进入追踪列表。

解决流程

  1. 创建 .gitignore:针对海思 SDK 结构,忽略 out/obj/ 及各种二进制产物。
  2. 清理索引:使用 git rm -r --cached .。该命令会从 Git 追踪中移除所有文件,但保留硬盘上的物理文件
  3. 重新提交git add . 后,Git 会根据新规则重新识别文件。

1. 目标:生成带符号表(Non-stripped)的程序#

核心痛点

在海思 SDK 中,即便开启了调试模式,生成的程序默认依然是 stripped(不含符号表),这是因为 SDK 强制开启了安全编译选项。

1.1 问题根源深度分析#

出现这种情况的原因是,海思SDK在安全编译选项中硬编码了 -s (strip) 参数。

  1. 安全编译选项硬编码:在 scripts/Makefile.secure.param 中,SECURE_EXEC_CFLAGSSECURE_LD_CFLAGS 被赋予了 -s 选项,用于增强发布版程序的安全性(防止逆向)。
  2. 变量赋值顺序:在 scripts/Makefile.cflags.param 中,LIBS_EXEC_CFLAGS 使用 :=(立即赋值)获取了包含 -s 的安全选项。即使后面检测到 OT_GDB=y 并添加了 -g,之前的 -s 依然存在于编译命令中。
  3. 链接器行为:在链接阶段,只要命令中出现 -s,链接器就会执行 strip 操作,这会覆盖 -g 生成调试信息。

1.2 验证方法#

命令行验证

你可以运行以下命令查看具体的变量定义,确认 -s 是否被注入:

Terminal window
make -p | grep -E "SECURE_EXEC_CFLAGS|SECURE_LD_CFLAGS"

你通常会看到类似 SECURE_EXEC_CFLAGS += -pie -s 的定义。


2. 最终完美方案 (Success)#

核心原理

直接使用 override 指令重写编译命令中最终引用的终端变量。这样可以绕过所有中间脚本的 := 快照和 += 追加。

完整配置流程#

  1. 修改 cfg.mak(开启基础调试开关):

    export CONFIG_OT_GDB_YES=y
    export CONFIG_OT_GDB=y
    export OT_RLS_MODE=OT_DEBUG
  2. 修改 mpp/sample/Makefile.param(在文件末尾添加):

    # 使用 override 强制拦截最终进入编译器的变量,清除其中的 '-s' 参数
    ifeq ($(OT_GDB), y)
    override LIBS_EXEC_CFLAGS :=
    override LIBS_LD_CFLAGS := -fno-common
    endif

验证验证#

Terminal window
make clean && make
file sample_venc

预期输出sample_venc: ..., with debug_info, not stripped

[海思 3519DV500] SDK 调试与编译配置
https://www.eustia-astraea.top/posts/hisi/hi3519dv500-sdk-debug/
作者
mcsl
发布于
2024-03-02
许可协议
CC BY-NC-SA 4.0