12.07.2015 Views

RealView - ARM Information Center

RealView - ARM Information Center

RealView - ARM Information Center

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

®<strong>RealView</strong>编 译 工 具3.1 版链 接 器 和 实 用 程 序 指 南版 权 所 有 © 2002-2007 <strong>ARM</strong> Limited。 保 留 所 有 权 利 。<strong>ARM</strong> DUI 00206HC


目 录<strong>RealView</strong> 编 译 工 具链 接 器 和 实 用 程 序 指 南前 言关 于 本 手 册 ..................................................................................................... vi反 馈 ................................................................................................................ ix第 1 章第 2 章第 3 章简 介1.1 armlink ........................................................................................................ 1-21.2 armar ........................................................................................................... 1-31.3 fromelf ......................................................................................................... 1-41.4 与 传 统 对 象 和 库 的 兼 容 性 ............................................................................ 1-5链 接 器 命 令 语 法2.1 关 于 armlink ................................................................................................ 2-22.2 armlink 命 令 语 法 ......................................................................................... 2-5使 用 基 本 链 接 器 功 能3.1 指 定 映 像 结 构 .............................................................................................. 3-23.2 节 布 局 ......................................................................................................... 3-73.3 优 化 和 修 正 ................................................................................................ 3-103.4 使 用 命 令 行 选 项 创 建 简 单 映 像 ................................................................... 3-243.5 使 用 命 令 行 选 项 处 理 C++ 异 常 .................................................................. 3-303.6 获 得 有 关 映 像 的 信 息 .................................................................................. 3-31<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 iii


前 言更 多 参 考 出 版 物本 部 分 列 出 了 <strong>ARM</strong> 公 司 和 第 三 方 发 布 的 、 可 提 供 有 关 <strong>ARM</strong> 系 列 处 理 器 开 发 代码 的 附 加 信 息 的 出 版 物 。<strong>ARM</strong> 公 司 将 定 期 对 其 文 档 进 行 更 新 和 更 正 。 有 关 最 新 勘 误 表 、 附 录 和 <strong>ARM</strong> 常见 问 题 解 答 , 请 访 问 http://www.arm.com。<strong>ARM</strong> 出 版 物本 手 册 包 含 的 参 考 信 息 专 用 于 随 RVCT 提 供 的 开 发 工 具 。 该 套 件 中 包 含 的 其 他出 版 物 有 :• 《RVCT 要 点 指 南 》(<strong>ARM</strong> DUI 0202)• 《RVCT 编 译 器 用 户 指 南 》(<strong>ARM</strong> DUI 0205)• 《RVCT 编 译 器 参 考 指 南 》(<strong>ARM</strong> DUI 0348)• 《RVCT 库 和 浮 点 支 持 指 南 》(<strong>ARM</strong> DUI 0349)• 《RVCT 汇 编 程 序 指 南 》(<strong>ARM</strong> DUI 0204)• 《RVCT 开 发 指 南 》(<strong>ARM</strong> DUI 0203)• 《NEON 向 量 化 编 译 器 指 南 》(<strong>ARM</strong> DUI 0350)• 《<strong>RealView</strong> Development Suite 词 汇 表 》(<strong>ARM</strong> DUI 0324)。有 关 基 本 标 准 、 软 件 接 口 以 及 <strong>ARM</strong> 支 持 的 标 准 的 完 整 信 息 , 请 参 阅install_directory\Documentation\Specifications\...。此 外 , 有 关 与 <strong>ARM</strong> 产 品 相 关 的 特 定 信 息 , 请 参 阅 下 列 文 档 :• 《<strong>ARM</strong>6-M 体 系 结 构 参 考 手 册 》 (<strong>ARM</strong> DDI 0419)• 《<strong>ARM</strong>7-M 体 系 结 构 参 考 手 册 》 (<strong>ARM</strong> DDI 0403)• 《<strong>ARM</strong> 体 系 结 构 参 考 手 册 》,<strong>ARM</strong>v7-A 和 <strong>ARM</strong>v7-R 版 (<strong>ARM</strong> DDI 0406)• 您 的 硬 件 设 备 的 <strong>ARM</strong> 数 据 表 或 技 术 参 考 手 册 。viii 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


前 言反 馈<strong>ARM</strong> 公 司 欢 迎 用 户 就 <strong>RealView</strong> 编 译 工 具 及 其 文 档 提 供 反 馈 意 见 。对 <strong>RealView</strong> 编 译 工 具 的 反 馈如 果 您 有 关 于 RVCT 的 任 何 问 题 , 请 与 您 的 供 应 商 联 系 。 为 便 于 他 们 快 速 提 供有 用 的 答 复 , 请 提 供 :• 您 的 姓 名 和 公 司• 产 品 序 列 号• 您 所 用 版 本 的 详 细 信 息• 您 运 行 的 平 台 的 详 细 信 息 , 如 硬 件 平 台 、 操 作 系 统 类 型 和 版 本• 能 重 现 问 题 的 一 小 段 独 立 代 码 示 例• 详 细 说 明 预 期 发 生 和 实 际 发 生 的 情 况• 您 使 用 的 命 令 , 包 括 所 有 命 令 行 选 项• 能 说 明 问 题 的 示 例 输 出• 工 具 的 版 本 字 符 串 , 包 括 版 本 号 和 内 部 版 本 号 。关 于 本 手 册 的 反 馈如 果 您 发 现 本 手 册 有 任 何 错 误 或 遗 漏 之 处 , 请 发 送 电 子 邮 件 到 errata@arm.com,并 提 供 :• 文 档 标 题• 文 档 编 号• 您 有 疑 问 的 页 码• 问 题 的 简 要 说 明 。我 们 还 欢 迎 您 对 需 要 增 加 和 改 进 之 处 提 出 建 议 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 ix


前 言x 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


简 介1.1 armlink<strong>ARM</strong> 链 接 器 armlink 将 一 个 或 多 个 目 标 文 件 的 内 容 与 一 个 或 多 个 对 象 库 的 选 定部 分 相 结 合 , 从 而 生 成 :• 一 个 可 执 行 和 链 接 格 式 (ELF) 的 可 执 行 映 像• 一 个 部 分 链 接 的 ELF 对 象 , 可 用 作 后 续 链 接 步 骤 的 输 入• 一 个 可 与 《<strong>ARM</strong> 体 系 结 构 的 基 础 平 台 应 用 程 序 二 进 制 接 口 》(BPABI) 或System V Release 4 (SVr4) 规 范 兼 容 的 共 享 对 象 , 或 是 一 个 BPABI 或 SVr4可 执 行 文 件 。有 关 <strong>ARM</strong> 链 接 器 和 所 有 命 令 行 选 项 的 详 细 信 息 , 请 参 阅 第 2 章 链 接 器 命 令 语法 。1-2 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


简 介1.4 与 传 统 对 象 和 库 的 兼 容 性如 果 从 先 前 版 本 升 级 到 RVCT, 请 务 必 阅 读 《<strong>RealView</strong> 编 译 工 具 要 点 指 南 》, 了解 最 新 信 息 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 1-5


简 介1-6 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


第 2 章链 接 器 命 令 语 法本 章 介 绍 了 随 RVCT 一 起 提 供 的 <strong>ARM</strong> 链 接 器 armlink 的 完 整 命 令 语 法 。 它 包 含以 下 几 节 :• 第 2-2 页 的 关 于 armlink• 第 2-5 页 的 armlink 命 令 语 法<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-1


链 接 器 命 令 语 法对 于 简 单 映 像 ,ELF 可 执 行 文 件 包 含 相 当 于 映 像 中 的 RO 和 RW 输 出 节 的 段 。ELF 可 执 行 文 件 还 具 有 包 含 映 像 输 出 节 的 ELF 节 。可 以 使 用 fromelf 将 ELF 可 执 行 格 式 的 可 执 行 映 像 转 换 为 其 他 文 件 格 式 。 有 关 详细 信 息 , 请 参 阅 第 8 章 使 用 fromelf。构 建 可 执 行 映 像使 用 链 接 器 构 建 可 执 行 映 像 时 , 它 将 :• 解 析 输 入 目 标 文 件 之 间 的 符 号 引 用• 从 库 中 提 取 对 象 模 块 来 满 足 还 未 满 足 的 符 号 引 用 的 需 要• 根 据 属 性 和 名 称 排 序 输 入 节 , 并 将 属 性 和 名 称 相 似 的 节 合 并 为 相 邻 块• 删 除 未 使 用 节• 删 除 重 复 的 公 共 组 和 公 共 代 码 、 数 据 及 调 试 节• 根 据 提 供 的 分 组 和 布 局 信 息 将 对 象 片 段 组 织 为 内 存 区• 给 可 重 定 位 值 分 配 地 址• 生 成 可 执 行 映 像 。有 关 详 细 信 息 , 请 参 阅 第 3-2 页 的 指 定 映 像 结 构 。构 建 部 分 链 接 对 象使 用 链 接 器 构 建 部 分 链 接 对 象 时 , 它 将 :• 删 除 重 复 的 调 试 节 副 本• 最 小 化 符 号 表 的 大 小• 将 未 解 析 的 引 用 保 留 为 未 解 析 状 态• 合 并 Comdat 组• 生 成 一 个 对 象 , 将 其 用 作 后 续 链 接 步 骤 的 输 入 。注 意如 果 使 用 部 分 链 接 , 则 不 能 通 过 分 散 加 载 描 述 文 件 中 的 名 称 来 引 用 组 件 对 象 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-3


链 接 器 命 令 语 法2.1.3 排 序 命 令 行 选 项通 常 , 命 令 行 选 项 可 以 在 一 次 链 接 器 调 用 中 以 任 意 顺 序 出 现 。 不 过 , 一 些 选 项 的效 果 取 决 于 它 们 如 何 与 其 他 相 关 选 项 组 合 。 例 如 ,--scatter 选 项 不 能 与 任 何 内存 映 射 选 项 结 合 使 用 。 请 参 阅 第 2-11 页 的 为 映 像 指 定 内 存 映 射 信 息 。如 果 选 项 在 相 同 的 命 令 行 上 覆 盖 先 前 的 选 项 , 则 最 后 的 选 项 将 优 先 执 行 。 如 果某 个 选 项 不 遵 循 该 规 则 , 则 在 说 明 中 予 以 指 明 。 使 用 --show_cmdline 选 项 可 查 看链 接 器 如 何 处 理 命 令 行 。 命 令 以 其 首 选 形 式 显 示 , 并 扩 展 所 有 via 文 件 的 内 容 。有 关 输 入 文 件 的 排 序 优 先 级 的 详 细 信 息 , 请 参 阅 第 2-6 页 的 指 定 输 入 文 件 列 表 。2.1.4 使 用 环 境 变 量 指 定 命 令 行 选 项通 过 设 置 RVCT31_LINKOPT 环 境 变 量 的 值 , 可 以 指 定 命 令 行 选 项 。 其 语 法 与 命 令 行语 法 相 同 。 链 接 器 读 取 RVCT31_LINKOPT 的 值 , 然 后 将 其 插 入 到 命 令 字 符 串 之 前 。这 意 味 着 在 RVCT31_LINKOPT 中 指 定 的 选 项 可 由 命 令 行 中 的 参 数 覆 盖 。2-4 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法2.2.1 访 问 帮 助 和 信 息要 获 取 关 于 可 用 命 令 行 选 项 和 工 具 版 本 号 的 信 息 , 请 使 用 :--help 输 出 一 些 常 用 命 令 行 选 项 的 汇 总 。--vsn 显 示 链 接 器 版 本 信 息 和 许 可 证 信 息 。--show_cmdline显 示 链 接 器 如 何 处 理 命 令 行 。 命 令 以 其 首 选 形 式 显 示 , 并 扩 展 所 有via 文 件 的 内 容 。2.2.2 工 程 模 板 选 项工 程 模 板 是 包 含 工 程 信 息 的 文 件 , 如 用 于 特 定 配 置 的 命 令 行 选 项 。 这 些 文 件 存储 在 工 程 模 板 工 作 目 录 中 。 以 下 选 项 控 制 工 程 模 板 的 使 用 。--[no_]project=[filename]--reinitialize_workdir--workdir=directory启 用 或 禁 用 工 程 模 板 文 件 的 使 用 。可 用 于 重 新 初 始 化 工 程 模 板 工 作 目 录 。可 用 于 提 供 工 程 模 板 的 工 作 目 录 。有 关 这 些 选 项 的 详 细 信 息 , 请 参 阅 :• 《 编 译 器 参 考 指 南 》 中 的 第 2-75 页 的 --[no_]project=filename• 《 编 译 器 参 考 指 南 》 中 的 第 2-78 页 的 --reinitialize_workdir• 《 编 译 器 参 考 指 南 》 中 的 第 2-96 页 的 --workdir=directory。2.2.3 指 定 输 入 文 件 列 表所 有 输 入 文 件 的 内 容 必 须 唯 一 。 如 果 多 次 定 义 了 符 号 , 则 链 接 器 会 生 成 错 误 消息 。这 些 选 项 定 义 传 递 给 链 接 器 的 输 入 文 件 :input-file-list这 是 以 空 格 分 隔 的 对 象 、 库 或 符 号 定 义 (symdefs) 文 件 的 列 表 。 链接 器 将 整 个 输 入 文 件 列 表 按 照 一 定 的 顺 序 排 列 。 如 果 链 接 器 无 法解 决 输 入 文 件 问 题 , 则 生 成 诊 断 消 息 。2-6 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法可 以 将 symdefs 文 件 包 括 在 列 表 中 , 为 先 前 生 成 的 映 像 文 件 提 供 全局 符 号 值 。 有 关 详 细 信 息 , 请 参 阅 第 4-8 页 的 访 问 其 他 映 像 中 的 符号 。可 以 用 以 下 方 式 来 使 用 输 入 文 件 列 表 中 的 库 :• 指 定 要 添 加 到 库 列 表 中 的 一 个 库 , 用 于 提 取 解 析 了 任 何 未 解析 的 非 弱 引 用 的 成 员 。 例 如 , 指 定 输 入 文 件 列 表 中 的mystring.lib。注 意仅 当 此 列 表 中 的 库 成 员 解 析 了 未 解 析 的 非 弱 引 用 时 , 才 将 该列 表 中 的 库 成 员 添 加 到 映 像 中 。--libpath pathlist• 指 定 从 库 中 提 取 的 特 定 成 员 , 并 将 它 们 作 为 单 个 对 象 添 加 到映 像 中 。 例 如 , 指 定 输 入 文 件 列 表 中 的mystring.lib(strcmp.o)。链 接 器 自 动 搜 索 适 当 的 C 和 C++ 库 以 便 为 映 像 选 择 最 佳 的 标 准 函数 。 您 可 以 使 用 --no_scanlib 来 防 止 自 动 搜 索 标 准 库 。链 接 器 按 以 下 顺 序 处 理 输 入 文 件 列 表 :1. 对 象 无 条 件 添 加 到 映 像 中 。2. 使 用 模 式 将 从 库 中 选 择 的 成 员 无 条 件 地 添 加 到 映 像 中 ( 如 同添 加 对 象 一 样 )。 例 如 , 以 下 命 令 无 条 件 地 添 加 mylib 中 的 所有 a*.o 对 象 和 stdio.o:armlink main.o mylib(stdio.o) mylib(a*.o)在 UNIX 平 台 上 , 可 能 需 要 对 括 号 进 行 转 义 , 例 如 :armlink main.o mylib\(stdio.o\)3. 将 标 准 C 或 C++ 库 添 加 到 库 列 表 中 , 以 后 用 于 解 析 任 何 遗 留的 引 用 。有 关 详 细 信 息 , 请 参 阅 第 7-3 页 的 库 搜 索 、 选 择 和 扫 描 。指 定 用 于 搜 索 <strong>ARM</strong> 标 准 C 和 C++ 库 的 路 径 列 表 。包 含 <strong>ARM</strong> 库 的 父 目 录 的 缺 省 路 径 由 RVCT31LIB 环 境 变 量 指 定 。 此 处指 定 的 任 何 路 径 都 将 覆 盖 由 RVCT31LIB 指 定 的 路 径 。pathlist 是 由 逗 号 分 隔 的 路 径 列 表 , 仅 用 于 搜 索 所 需 的 <strong>ARM</strong> 库 。指 定 多 个 路 径 名 时 , 在 逗 号 和 路 径 名 之 间 不 要 留 有 空 格 , 例 如path1,path2,path3,...,pathn。此 列 表 必 须 以 <strong>ARM</strong> 库 目 录 armlib 和 cpplib 的 父 目 录 结 束 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-7


链 接 器 命 令 语 法注 意此 选 项 不 影 响 搜 索 用 户 库 。 应 改 为 使 用 --userlibpath。--library_type=lib有 关 包 含 库 的 详 细 信 息 , 请 参 阅 第 7-3 页 的 库 搜 索 、 选 择 和 扫 描 。启 用 链 接 时 使 用 的 相 关 库 选 择 。其 中 lib 可 以 是 以 下 项 之 一 :standardlibmicrolib指 定 在 链 接 时 选 择 完 整 的 RVCT 运 行 时 库 。 这是 缺 省 设 置 。指 定 在 链 接 时 选 择 C 微 型 库 (microlib)。注 意如 果 使 用 库 需 要 更 多 的 特 定 优 化 , 则 可 以 将 此 选 项 与 编 译 器 、 汇 编程 序 或 链 接 器 一 起 使 用 。将 此 选 项 与 链 接 器 一 起 使 用 可 覆 盖 所 有 其 他 --library_type 选 项 。--[no_]reduce_paths有 关 详 细 信 息 , 请 参 阅 :• 《 库 指 南 》 中 的 第 3-3 页 的 使 用 microlib 构 建 应 用 程 序• 《 编 译 器 参 考 指 南 》 中 的 第 2-55 页 的 --library_type=lib。启 用 或 禁 用 在 文 件 路 径 中 删 除 冗 余 路 径 名 信 息 。 此 选 项 只 在Windows 系 统 中 有 效 。Windows 系 统 对 文 件 路 径 有 260 个 字 符 的 限 制 。 如 果 存 在 其 绝 对 路径 名 长 度 超 过 了 260 个 字 符 的 相 对 路 径 名 , 则 可 以 使 用--reduce_paths 选 项 , 通 过 使 用 对 应 的 .. 实 例 匹 配 目 录 并 成 对 删 除directory/.. 序 列 , 来 减 少 绝 对 路 径 名 的 长 度 。注 意建 议 优 先 使 用 --reduce_paths 选 项 来 尽 量 缩 短 路 径 长 度 , 并 避 免 使用 长 文 件 路 径 和 深 层 嵌 套 文 件 路 径 。有 关 详 细 信 息 , 请 参 阅 《 编 译 器 参 考 指 南 》 中 的 第 2-77 页 的--[no_]reduce_paths。2-8 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法--[no_]scanlib--userlibpath pathlist启 用 或 禁 用 扫 描 缺 省 库 ( 标 准 <strong>ARM</strong> C 和 C++ 库 ) 以 解 析 引用 。--scanlib 是 缺 省 值 。指 定 用 于 搜 索 用 户 库 的 路 径 列 表 。pathlist 是 由 逗 号 分 隔 的 路 径 列 表 , 用 于 搜 索 所 需 的 库 。 指 定 多 个路 径 名 时 , 在 逗 号 和 路 径 名 之 间 不 要 留 有 空 格 , 例 如path1,path2,path3,...,pathn。有 关 包 含 用 户 库 的 详 细 信 息 , 请 参 阅 第 7-3 页 的 库 搜 索 、 选 择 和 扫描 。2.2.4 控 制 链 接 器 行 为以 下 选 项 控 制 对 象 的 链 接 方 式 :--match crossmangled指 示 链 接 器 将 以 下 组 合 作 为 整 体 进 行 匹 配 :• 对 具 有 重 整 定 义 的 未 重 整 符 号 的 引 用• 对 具 有 未 重 整 定 义 的 重 整 符 号 的 引 用 。库 和 匹 配 按 以 下 方 式 操 作 :• 如 果 库 成 员 定 义 了 重 整 定 义 , 并 且 存 在 未 解 析 的 未 重 整 引 用 ,则 加 载 成 员 以 满 足 它 。• 如 果 库 成 员 定 义 了 未 重 整 定 义 , 并 且 存 在 未 解 析 的 重 整 引 用 ,则 加 载 成 员 以 满 足 它 。注 意此 选 项 与 部 分 链 接 一 起 使 用 时 无 效 果 。 即 使 存 在 重 整 定 义 , 部 分 对象 也 包 含 所 有 对 未 重 整 符 号 的 未 解 析 引 用 。 只 在 最 后 的 链 接 步 骤中 完 成 匹 配 。--strict指 示 链 接 器 将 可 能 会 产 生 故 障 的 条 件 报 告 为 错 误 而 不 是 警 告 。 其中 一 个 条 件 示 例 是 : 从 非 交 互 函 数 获 取 交 互 函 数 的 地 址 。--[no_]strict_relocations--strict_relocation 指 示 链 接 器 报 告 已 过 时 的 和 不 提 倡 使 用 的 重 定位 的 实 例 。在 链 接 使 用 先 前 版 本 的 <strong>ARM</strong> 工 具 构 建 的 目 标 文 件 时 , 最 有 可 能 发生 重 定 位 错 误 和 警 告 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-9


链 接 器 命 令 语 法--unresolved symbol使 用 此 选 项 可 以 确 保 对 象 的 ABI 兼 容 性 。 缺 省 情 况 下 关 闭 该 选 项 ,并 且 链 接 器 在 可 能 时 自 动 处 理 不 提 倡 使 用 和 已 过 时 的 重 定 位 。将 每 个 对 未 定 义 符 号 的 引 用 与 symbol 的 全 局 定 义 匹 配 。 symbol 必 须已 定 义 且 是 全 局 的 , 否 则 它 会 显 示 在 未 定 义 符 号 列 表 中 , 并 且 链 接步 骤 失 败 。 此 选 项 在 自 上 而 下 的 开 发 中 尤 为 有 用 , 因 为 它 可 以 通 过将 每 个 对 缺 失 函 数 的 引 用 与 虚 拟 函 数 匹 配 来 测 试 部 分 实 现 的 系 统 。2.2.5 指 定 输 出 类 型 和 输 出 文 件 名使 用 以 下 选 项 指 定 输 出 文 件 的 格 式 和 名 称 :--bpabi 创 建 BPABI 可 执 行 文 件 以 便 传 递 至 平 台 特 定 的 后 链 接 器 。--dll创 建 BPABI 动 态 链 接 库 (DLL)。 在 ELF 文 件 头 中 ,DLL 标 记 为 共享 对 象 。--output file指 定 输 出 文 件 的 名 称 。 该 文 件 可 以 是 部 分 链 接 对 象 或 可 执 行 映 像 。如 果 未 指 定 输 出 文 件 名 , 则 链 接 器 使 用 以 下 缺 省 名 称 :__image.axf如 果 输 出 是 可 执 行 映 像__object.o 如 果 输 出 是 部 分 链 接 对 象 。如 果 指 定 file 时 不 带 路 径 信 息 , 则 它 将 在 当 前 工 作 目 录 中 创 建 。 如果 指 定 了 路 径 信 息 , 则 该 目 录 将 成 为 缺 省 的 输 出 目 录 。--partial 创 建 部 分 链 接 对 象 , 而 不 是 可 执 行 映 像 。--reloc 创 建 可 重 定 位 的 ELF 映 像 。可 重 定 位 映 像 有 一 个 包 含 重 定 位 信 息 的 动 态 段 , 可 用 于 在 链 接 后 重新 定 位 映 像 。 链 接 后 重 定 位 的 示 例 包 括 高 级 ROM 构 建 和 运 行 时 动态 加 载 。如 果 映 像 在 链 接 时 的 地 址 加 载 , 则 链 接 器 生 成 的 可 重 定 位 映 像 不 需要 处 理 重 定 位 , 并 且 映 像 的 调 试 数 据 有 效 。 当 加 载 映 像 的 地 址 与 链接 时 的 地 址 不 同 时 , 将 会 处 理 重 定 位 , 不 过 映 像 中 现 有 的 任 何 调 试数 据 都 将 无 效 。单 独 使 用 时 ,--reloc 生 成 的 映 像 类 似 于 简 单 类 型 1, 映 像 的 载 入 区属 性 设 置 为 RELOC。 有 关 详 细 信 息 , 请 参 阅 第 3-24 页 的 类 型 1, 一 个加 载 区 和 几 个 连 续 执 行 区 。--shared 创 建 SVr4 共 享 对 象 。2-10 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。--sysv 创 建 可 在 <strong>ARM</strong> Linux 上 使 用 的 SVr4 格 式 的 ELF 可 执 行 文 件 。有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。2.2.6 为 映 像 指 定 内 存 映 射 信 息使 用 以 下 选 项 指 定 内 存 映 射 :--[no_]autoat控 制 __at 节 到 执 行 区 的 自 动 分 配 。__at 节 是 必 须 放 在 特 定 地 址 的节 。 有 关 详 细 信 息 , 请 参 阅 第 5-36 页 的 使 用 __at 节 将 节 放 在 特 定地 址 中 。如 果 启 用 , 则 链 接 器 将 自 动 为 每 个 __at 节 选 择 执 行 区 。 如 果 不 存 在适 用 的 执 行 区 , 则 链 接 器 将 创 建 载 入 区 和 执 行 区 以 包 含 __at 节 。如 果 禁 用 , 则 将 应 用 标 准 分 散 加 载 节 选 择 规 则 。 有 关 详 细 信 息 , 请参 阅 第 5-18 页 的 输 入 节 描 述 。缺 省 为 --no_autoat。--fpic 可 用 于 链 接 位 置 无 关 代 码 (PIC), 即 使 用 /fpic 限 定 符 编 译 的 代 码 。只 有 在 代 码 使 用 System V 共 享 库 时 才 执 行 相 对 寻 址 。注 意如 果 使 用 了 --shared 但 未 使 用 --fpic, 则 链 接 器 将 输 出 一 个 可 降 级错 误 。--predefine="string"使 命 令 可 以 传 递 到 分 散 文 件 的 第 一 行 中 指 定 的 预 处 理 器 。 您 还 可以 使 用 同 义 词 :--pd="string"。在 命 令 行 上 可 以 使 用 多 个 --predefine 选 项 。 将 此 选 项 与 --scatter结 合 使 用 。 示 例 2-1 显 示 了 分 散 文 件 在 预 处 理 之 前 的 外 观 。示 例 2-1 预 处 理 之 前 的 分 散 文 件Scatter file:#! armcc -Elr1 BASE{<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-11


链 接 器 命 令 语 法}er1 BASE{*(+RO)}er2 BASE2{*(+RW+ZI)}使 用 带 以 下 命 令 行 选 项 的 armlink:--predefine="-DBASE=0x8000" --predefine="-DBASE2=0x1000000"--scatter file这 会 将 命 令 行 选 项 :-DBASE=0x8000 -DBASE2=0x1000000 传 递 到 编 译 器以 预 处 理 分 散 文 件 。示 例 2-2 显 示 了 分 散 文 件 在 预 处 理 之 后 的 外 观 :示 例 2-2 预 处 理 之 后 的 分 散 文 件lr1 0x8000{er1 0x8000{*(+RO)}er2 0x1000000{*(+RW+ZI)}}--ro-base address将 包 含 RO 输 出 节 的 区 的 加 载 地 址 和 执 行 地 址 都 设 置 为 address。address 必 须 是 字 对 齐 的 。 如 果 未 指 定 此 选 项 , 并 且 没 有 指 定 分 散 加载 文 件 , 则 缺 省 RO 基 址 为 0x8000。--ropi使 包 含 RO 输 出 节 的 载 入 区 和 执 行 区 与 位 置 无 关 。 如 果 未 使 用 此 选项 , 则 将 区 标 记 为 绝 对 地 址 区 。 通 常 每 个 只 读 输 入 节 必 须 为 只 读 的位 置 无 关 代 码 (ROPI)。 如 果 选 择 了 此 选 项 , 则 链 接 器 将 :• 检 查 节 之 间 的 重 定 位 信 息 的 有 效 性2-12 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法• 确 保 armlink 本 身 生 成 的 任 何 代 码 ( 如 交 互 操 作 胶 合 代 码 ) 为只 读 的 位 置 无 关 代 码 。注 意如 果 使 用 不 带 --rwpi 或 --rw-base 的 --ropi, 则 链 接 器 将 显 示 一 个 可降 级 错 误 。--rosplit将 缺 省 RO 载 入 区 分 为 两 个 RO 输 出 节 , 一 个 用 于 RO-CODE, 另 一 个用 于 RO-DATA。--rw-base address将 包 含 RW 输 出 节 的 区 的 执 行 地 址 设 置 为 address。 address 必 须 是字 对 齐 的 。--rwpi将 包 含 RW 和 ZI 输 出 节 的 载 入 区 和 执 行 区 设 置 为 与 位 置 无 关 。 如果 未 使 用 此 选 项 , 则 将 区 标 记 为 绝 对 地 址 区 。 此 选 项 需 要 --rw-base的 值 。 如 果 未 指 定 --rw-base, 则 假 定 为 --rw-base 0。 通 常 每 个 可 写输 入 节 必 须 为 可 读 写 的 位 置 无 关 代 码 (RWPI)。如 果 选 择 了 此 选 项 , 则 链 接 器 将 :• 检 查 是 否 在 任 何 读 写 执 行 区 的 输 入 节 上 设 置 了 PI 属 性• 检 查 节 之 间 的 重 定 位 信 息 的 有 效 性• 生 成 与 表 Region$$Table 中 的 静 态 基 址 相 关 的 条 目 。这 在 复 制 、 解 压 缩 或 初 始 化 区 时 使 用 。--scatter file使 用 file 中 包 含 的 分 散 加 载 描 述 来 创 建 映 像 内 存 映 射 。 该 描 述 提供 映 像 中 各 个 区 和 节 的 分 组 和 布 局 的 详 细 信 息 。 请 参 阅 第 5 章 使用 分 散 加 载 描 述 文 件 。--scatter 选 项 不 能 与 任 意 内 存 映 射 选项 :--partial、--ro-base、--rw-base、--ropi、--rwpi、--rosplit 或--split 结 合 使 用 , 也 不 能 与 --reloc 或 --startup 结 合 使 用 。--split 将 包 含 RO 和 RW 输 出 节 的 缺 省 载 入 区 分 成 以 下 载 入 区 :• 一 个 包 含 RO 输 出 节 的 区 。 缺 省 的 加 载 地 址 是 0x8000, 但 可 以使 用 --ro-base 选 项 指 定 其 他 地 址 。• 一 个 包 含 RW 和 ZI 输 出 节 的 区 。 使 用 --rw-base 选 项 可 指 定 加载 地 址 。 此 选 项 需 要 --rw-base 的 值 。 如 果 未 指 定 --rw-base,则 假 定 为 --rw-base 0。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-13


链 接 器 命 令 语 法两 个 区 都 是 根 区 。 有 关 详 细 信 息 , 请 参 阅 第 3-2 页 的 指 定 映 像 结 构 。2.2.7 控 制 调 试 信 息这 些 选 项 控 制 映 像 中 的 调 试 信 息 :--[no_]debug 使 用 --debug 在 输 出 文 件 中 包 括 调 试 信 息 。 调 试 信 息 包 括 调 试 输 入节 以 及 符 号 和 字 符 串 表 。 这 是 缺 省 设 置 。使 用 --no_debug 从 输 出 文 件 中 排 除 调 试 信 息 。 ELF 映 像 将 变 小 , 但不 能 在 源 代 码 级 别 对 其 进 行 调 试 。 链 接 器 放 弃 在 输 入 对 象 和 库 成员 中 找 到 的 任 何 调 试 输 入 节 , 并 且 不 包 括 映 像 中 的 符 号 和 字 符 串表 。 仅 在 载 入 到 调 试 器 时 对 映 像 的 大 小 有 影 响 。 不 影 响 下 载 到 目 标的 任 何 最 终 二 进 制 映 像 的 大 小 。如 果 创 建 部 分 链 接 对 象 , 而 不 是 映 像 , 则 链 接 器 放 弃 在 输 入 对 象 中找 到 的 调 试 输 入 节 , 但 在 部 分 链 接 对 象 中 生 成 符 号 和 字 符 串 表 。注 意如 果 需 要 fromelf --fieldoffsets 步 骤 , 则 不 要 使 用 --no_debug。 如 果生 成 的 映 像 没 有 调 试 信 息 , 则 fromelf 无 法 :• 将 映 像 转 换 为 其 他 文 件 格 式• 生 成 有 意 义 的 反 汇 编 列 表 。--[no_]bestdebug--[no_]compress_debug在 用 于 最 小 代 码 / 数 据 大 小 或 最 佳 调 试 效 应 的 链 接 之 间 选 择 。 输 入对 象 可 能 包 含 Comdat 组 , 但 由 于 存 在 差 异 , 因 此 这 些 组 在 所 有 输入 对 象 中 可 能 并 不 完 全 相 同 。 例 如 , 内 联 。--no_bestdebug 是 缺 省 值 。 这 确 保 了 无 论 是 否 针 对 调 试 进 行 编 译 ,最 终 映 像 的 代 码 和 数 据 都 相 同 。 链 接 时 选 中 最 小 的 Comdat 组 , 代价 是 可 能 会 造 成 略 差 的 调 试 效 应 。使 用 --bestdebug 可 选 择 具 有 最 佳 调 试 视 图 的 Comdat 组 。 请 注 意 ,最 终 映 像 的 代 码 和 数 据 在 带 或 不 带 调 试 选 项 进 行 构 建 时 , 可 能 会 有所 不 同 。有 关 详 细 信 息 , 请 参 阅 第 3-10 页 的 公 共 组 或 节 删 除 。--compress_debug 建 议 链 接 器 在 合 理 的 情 况 下 压 缩 .debug_* 节 。 这 将删 除 部 分 冗 余 并 减 少 调 试 表 大 小 。 使 用 --compress_debug 会 显 著 增加 链 接 映 像 所 需 的 时 间 。 调 试 压 缩 只 能 在 DWARF3 调 试 数 据 上 执行 , 不 能 在 DWARF2 上 执 行 。2-14 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法--no_compress_debug 是 缺 省 值 。--[no_]dynamic_debug--dynamic_debug 强 制 链 接 器 输 出 调 试 节 的 动 态 重 定 位 信 息 。通 过 此 选 项 , 可 使 用 能 够 识 别 OS 的 调 试 器 来 调 试 armlink 生 成 的 共享 库 。将 --dynamic_debug 与 --sysv 以 及 --sysv --shared 映 像 和 共 享 库 结 合使 用 。有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。2.2.8 控 制 映 像 内 容以 下 选 项 控 制 影 响 映 像 内 容 的 各 种 因 素 :--[no_]branchnop--branchnop 选 项 使 链 接 器 将 任 何 跳 转 替 换 为 一 个 重 定 位 , 该 重 定 位可 解 析 为 具 有 NOP 的 下 一 条 指 令 。 这 是 缺 省 设 置 。使 用 --no_branchnop 可 禁 用 此 行 为 。--[no_]cppinit symbol有 关 控 制 跳 转 内 联 的 详 细 信 息 , 请 参 阅 第 3-20 页 的 跳 转 内 联 。--cppinit symbol 选 项 使 链 接 器 可 以 使 用 带 有 不 同 初 始 化 符 号 的 备选 C++ 库 。 缺 省 情 况 下 ,symbol 设 置 为 :__cpp_initialize__aeabi_--no_cppinit 选 项 不 使 用 symbol 自 变 量 。--cpu=list--cpu=name此 选 项 列 出 所 支 持 的 可 以 与 --cpu=name 选 项 结 合 使 用 的 体 系 结 构 和处 理 器 名 称 。启 用 特 定 <strong>ARM</strong> 处 理 器 或 体 系 结 构 的 代 码 生 成 功 能 。如 果 任 何 组 件 目 标 文 件 依 赖 的 功 能 与 所 选 处 理 器 不 兼 容 , 则 链 接 阶段 失 败 。 链 接 器 还 使 用 此 选 项 对 选 择 的 系 统 库 以 及 任 何 在 构 建 最终 映 像 时 需 要 生 成 的 胶 合 代 码 进 行 优 化 。 缺 省 情 况 下 选 择 与 所 有组 件 目 标 文 件 兼 容 的 CPU。此 选 项 遵 循 编 译 器 所 支 持 的 相 同 格 式 。 有 关 详 细 信 息 , 请 参 阅 《 编译 器 参 考 指 南 》 中 的 第 2-16 页 的 --cpu=name。--datacompressor on|off<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-15


链 接 器 命 令 语 法--datacompressor list|id--dynamiclinker name--edit file-list--entry location缺 省 情 况 下 , 将 会 启 用 RW 数 据 压 缩 以 便 最 大 程 度 地 减 小 ROM 大小 。 使 用 --datacompressor off 可 关 闭 RW 数 据 压 缩 。可 用 于 为 RW 数 据 压 缩 指 定 提 供 的 算 法 之 一 :• 使 用 --datacompressor list 可 获 取 可 供 链 接 器 使 用 的 数 据 压 缩器 的 列 表 。• 如 果 您 未 指 定 数 据 压 缩 算 法 , 则 链 接 器 将 自 动 选 择 一 种 最 合适 的 算 法 。 通 常 不 必 覆 盖 此 选 择 。 有 关 详 细 信 息 , 请 参 阅第 3-15 页 的 RW 数 据 压 缩 。如 果 要 覆 盖 链 接 器 , 请 使 用 --datacompressor id 指 定 数 据 压 缩算 法 。 指 定 压 缩 器 后 , 便 会 将 解 压 缩 器 添 加 至 代 码 区 。 如 果最 终 映 像 没 有 压 缩 的 数 据 , 则 不 添 加 解 压 缩 器 。指 定 用 于 在 运 行 时 加 载 和 重 定 位 文 件 的 动 态 链 接 器 。 与 共 享 对 象链 接 时 , 动 态 链 接 器 使 用 存 储 在 可 执 行 文 件 中 的 相 关 性 信 息 来 标 识要 加 载 的 文 件 。 如 果 在 <strong>ARM</strong> Linux 平 台 上 工 作 , 则 链 接 器 假 定 缺省 动 态 链 接 器 为 /lib/ld-linux.so.3。有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。可 用 于 指 定 控 制 文 件 , 其 中 包 含 用 于 编 辑 输 出 二 进 制 中 的 符 号 表 的命 令 。 您 可 以 在 控 制 文 件 中 指 定 命 令 来 :• 隐 藏 全 局 符 号 。 使 用 此 选 项 可 隐 藏 目 标 文 件 中 的 特 定 全 局 符号 。 隐 藏 符 号 不 是 公 共 可 见 的 。• 重 命 名 全 局 符 号 。 使 用 此 选 项 可 解 决 符 号 命 名 冲 突 。有 关 控 制 文 件 语 法 的 详 细 信 息 , 请 参 阅 第 4-11 页 的 隐 藏 和 重 命 名全 局 符 号 。如 果 指 定 多 个 控 制 文 件 , 可 以 使 用 以 下 语 法 之 一 :armlink --edit file1 --edit file2 --edit file3armlink --edit file1,file2,file3不 要 在 逗 号 和 文 件 名 之 间 留 有 空 格 。2-16 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法指 定 映 像 的 唯 一 初 始 入 口 点 。 该 映 像 可 包 含 多 个 入 口 点 , 但 使 用 此选 项 指 定 的 初 始 入 口 点 存 储 在 可 执 行 文 件 标 题 中 , 以 供 加 载 程 序 使用 。 此 选 项 在 命 令 行 中 只 能 使 用 一 次 。 加 载 映 像 时 ,<strong>ARM</strong><strong>RealView</strong> Debugger 使 用 此 入 口 地 址 来 初 始 化 程 序 计 数 器 (PC)。 初始 入 口 点 必 须 满 足 以 下 条 件 :• 映 像 入 口 点 必 须 在 执 行 区 内• 执 行 区 必 须 是 非 重 叠 的 , 而 且 必 须 是 根 执 行 区 ( 加 载 地 址 ==执 行 地 址 )。使 用 以 下 一 项 替 换 location:entry_address一 个 数 值 , 例 如 :--entry 0x0symbol将 映 像 入 口 点 指 定 为 symbol 的 地 址 , 例 如 :--entryreset_handleroffset+object(section)将 映 像 入 口 点 指 定 为 特 定 object 的 section 中 的 offset,例 如 :--entry 8+startup.o(startupseg)在 --entry 的 自 变 量 中 不 能 包 含 空 格 。 匹 配 输 入 节 和 对 象名 时 不 区 分 大 小 写 。 可 以 使 用 以 下 简 化 表 示 法 :• 如 果 offset 为 零 , 则 使 用 object(section)。• 如 果 只 有 一 个 输 入 节 , 则 使 用 object。 如 果 object 中有 多 个 输 入 节 , 则 armlink 将 生 成 一 则 错 误 消 息 。注 意如 果 映 像 的 入 口 地 址 在 Thumb 状 态 下 , 则 地 址 的 最 低 有 效 位 必 须设 置 为 1。 如 果 指 定 了 符 号 , 则 链 接 器 会 自 动 完 成 此 操 作 。 例 如 ,如 果 入 口 代 码 在 Thumb 状 态 下 从 地 址 0x8000 开 始 , 则 必 须 使 用--entry 0x8001。--[no_]exceptions使 用 --exceptions 可 使 最 终 映 像 包 含 异 常 表 。 这 是 缺 省 设 置 。如 果 删 除 未 使 用 节 之 后 映 像 中 出 现 任 何 异 常 节 , 则 使 用--no_exceptions 可 强 制 链 接 器 生 成 一 则 错 误 消 息 。 使 用 此 选 项 可 确保 代 码 中 不 出 现 异 常 。有 关 详 细 信 息 , 请 参 阅 第 3-30 页 的 使 用 命 令 行 选 项 处 理 C++ 异常 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-17


链 接 器 命 令 语 法--exceptions_tables=action指 定 如 何 为 尚 不 包 含 异 常 展 开 表 的 对 象 生 成 异 常 表 。 使 用 以 下 一项 替 换 action:nocreate 链 接 器 不 创 建 丢 失 异 常 表 。 这 是 缺 省 设 置 。unwind链 接 器 为 不 带 异 常 表 的 映 像 中 的 每 个 节 创 建 一 个 展 开表 。cantunwind链 接 器 为 不 带 异 常 表 的 映 像 中 的 每 个 节 创 建 一 个 非 展 开表 。有 关 详 细 信 息 , 请 参 阅 第 3-30 页 的 使 用 命 令 行 选 项 处 理 C++ 异常 。--[no_]export_all使 用 --export_all 从 可 执 行 文 件 或 DLL 中 动 态 导 出 所 有 全 局 的 非 隐藏 符 号 。 这 是 共 享 库 和 DLL 的 缺 省 值 。使 用 --no_export_all 可 禁 止 将 符 号 导 出 到 动 态 符 号 表 。 这 是 应 用 程序 的 缺 省 值 。--fini symbol--first section-id要 更 精 确 地 控 制 符 号 导 出 , 请 使 用 一 个 或 多 个 控 制 文 件 。 如 果 使 用了 控 制 文 件 , 则 此 选 项 没 有 任 何 效 果 。 有 关 详 细 信 息 , 请 参 阅第 4-11 页 的 隐 藏 和 重 命 名 全 局 符 号 。指 定 用 于 为 最 终 化 代 码 定 义 入 口 点 的 符 号 名 。 当 动 态 链 接 器 卸 载可 执 行 文 件 或 共 享 对 象 时 , 将 执 行 此 代 码 。有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。将 选 定 的 输 入 节 放 置 为 其 执 行 区 中 的 第 一 个 节 。 例 如 , 这 样 可 以 将包 含 向 量 表 的 节 放 置 为 映 像 中 的 第 一 个 节 。 使 用 以 下 一 项 替 换section-id:symbol选 择 定 义 symbol 的 节 。 由 于 只 能 有 一 个 节 放 置 为 第 一 个节 , 因 此 不 能 指 定 有 多 个 定 义 的 符 号 。 例 如 :--firstresetobject(section)从 object 中 选 择 section。 在 object 和 后 面 的 左 括 号 之 间不 能 有 空 格 。 例 如 :--first init.o(init)2-18 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法object选 择 object 中 的 单 个 输 入 节 。 使 用 此 短 格 式 时 , 如 果 有 多个 输 入 节 , 则 armlink 会 生 成 一 则 错 误 消 息 。 例 如 :--firstinit.o注 意使 用 分 散 加 载 时 , 请 在 分 散 加 载 描 述 文 件 中 改 为 使 用 +FIRST。有 关 详 细 信 息 , 请 参 阅 第 3-8 页 的 按 属 性 排 序 输 入 节 。--[no_]force_so_throw控 制 映 像 是 否 能 抛 出 异 常 。 缺 省 情 况 下 , 如 果 没 有 代 码 抛 出 异 常 ,则 丢 弃 异 常 表 。--no_force_so_throw 是 缺 省 值 。使 用 --force_so_throw 选 项 指 定 所 有 共 享 对 象 可 能 会 抛 出 异 常 , 因此 强 制 链 接 器 保 留 异 常 表 , 而 无 论 映 像 是 否 能 够 抛 出 异 常 。 如 果 使用 了 --sysv 选 项 , 则 自 动 设 置 --force_so_throw。有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。--fpu=list--fpu=name此 选 项 列 出 所 支 持 的 可 以 与 --fpu=name 选 项 结 合 使 用 的 FPU 体 系 结构 名 称 。启 用 特 定 FPU 体 系 结 构 的 代 码 生 成 功 能 。如 果 任 何 组 件 目 标 文 件 依 赖 的 功 能 与 所 选 FPU 体 系 结 构 不 兼 容 ,则 链 接 阶 段 失 败 。 链 接 器 还 使 用 此 选 项 对 选 择 的 系 统 库 以 及 任 何在 构 建 最 终 映 像 时 需 要 生 成 的 胶 合 代 码 进 行 优 化 。 缺 省 情 况 下 选择 与 所 有 组 件 目 标 文 件 兼 容 的 FPU。此 选 项 遵 循 编 译 器 所 支 持 的 相 同 格 式 。 有 关 详 细 信 息 , 请 参 阅 《 编译 器 参 考 指 南 》 中 的 第 2-42 页 的 --fpu=name。--init symbol指 定 用 于 定 义 初 始 化 代 码 的 符 号 名 。 当 动 态 链 接 器 加 载 可 执 行 文件 或 共 享 对 象 时 , 将 执 行 此 代 码 。有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。--[no_]inline--inline 使 跳 转 内 联 功 能 可 优 化 映 像 中 的 小 函 数 调 用 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-19


链 接 器 命 令 语 法注 意缺 省 情 况 下 此 跳 转 优 化 是 关 闭 的 , 因 为 启 用 该 功 能 会 更 改 映 像 , 从而 可 能 导 致 调 试 信 息 不 正 确 。 如 果 启 用 , 则 链 接 器 不 会 尝 试 更 正 调试 信 息 。--keep section-id有 关 控 制 跳 转 内 联 的 详 细 信 息 , 请 参 阅 第 3-20 页 的 跳 转 内 联 。指 定 删 除 未 使 用 节 时 不 能 删 除 的 输 入 节 ( 请 参 阅 第 3-4 页 的 指 定 映像 的 内 存 映 射 )。section-id 自 变 量 的 所 有 形 式 都 可 以 包 含 * 和 ? 通 配 符 。 可 以 在 命令 行 中 指 定 多 个 --keep 选 项 。使 用 以 下 一 项 替 换 section-id:symbolobject(section)object--last section-id指 定 在 删 除 未 使 用 节 时 保 留 定 义 symbol 的 输 入 节 。 如 果symbol 存 在 多 个 定 义 , 则 armlink 将 生 成 一 则 错 误 消 息 。例 如 , 您 可 能 使 用 --keep int_handler。要 保 留 定 义 以 _handler 结 尾 的 符 号 的 所 有 节 , 请 使 用--keep *_handler。指 定 在 删 除 未 使 用 节 时 保 留 object 中 的 section。 例 如 ,要 保 留 vectors.o 对 象 的 vect 节 , 请 使 用 :--keepvectors.o(vect)要 保 留 vectors.o 对 象 中 节 名 称 的 前 三 个 字 母 是 vec 的 所有 节 , 请 使 用 :--keep vectors.o(vec*)指 定 在 删 除 未 使 用 节 时 保 留 object 中 的 单 个 输 入 节 。 如果 使 用 此 短 格 式 , 但 object 中 有 多 个 输 入 节 , 则 armlink将 生 成 一 则 错 误 消 息 。例 如 , 您 可 能 使 用 --keep dspdata.o。要 保 留 名 称 以 dsp 开 头 的 每 个 对 象 中 的 单 个 输 入 节 , 请 使用 --keep dsp*.o。2-20 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法将 选 定 的 输 入 节 放 置 为 其 执 行 区 中 的 最 后 一 个 节 。 例 如 , 这 样 可 以强 制 将 包 含 校 验 和 的 输 入 节 放 置 为 RW 节 中 的 最 后 一 个 节 。 使 用 以下 一 项 替 换 section-id:symbol选 择 定 义 symbol 的 节 。 由 于 只 能 有 一 个 节 放 置 为 最 后 一个 节 , 因 此 不 能 指 定 有 多 个 定 义 的 符 号 。 例 如 :--lastchecksumobject(section)object从 object 中 选 择 section。 在 object 和 后 面 的 左 括 号 之 间不 能 有 空 格 。 例 如 :--last checksum.o(check)选 择 object 中 的 单 个 输 入 节 。 如 果 object 中 有 多 个 输 入节 , 则 armlink 将 生 成 一 则 错 误 消 息 。注 意使 用 分 散 加 载 时 , 请 在 分 散 加 载 描 述 文 件 中 改 用 +LAST。有 关 详 细 信 息 , 请 参 阅 第 3-8 页 的 按 属 性 排 序 输 入 节 。--[no_]locals使 用 --locals 可 指 示 链 接 器 在 生 成 可 执 行 映 像 时 将 局 部 符 号 添 加 到输 出 符 号 表 中 。 这 是 缺 省 设 置 。使 用 --no_locals 可 指 示 链 接 器 不 将 局 部 符 号 添 加 到 输 出 符 号 表 中 。如 果 要 减 小 输 出 符 号 表 的 大 小 , 则 这 是 非 常 有 用 的 优 化 。--[no_]merge 指 示 链 接 器 合 并 由 编 译 器 放 置 在 可 共 享 节 中 的 const 字 符 串 。 如 果const 字 符 串 之 间 有 相 似 性 , 则 此 选 项 可 减 少 映 像 的 大 小 。 缺 省 为--merge。--linux_abitag version-id可 用 于 指 定 所 构 建 的 可 执 行 文 件 兼 容 的 最 低 Linux 内 核 版 本 。有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。--pad num可 用 于 设 置 填 充 字 节 的 值 。 链 接 器 将 此 值 赋 给 插 入 载 入 区 或 执 行区 的 所 有 填 充 字 节 。num 是 一 个 整 数 , 可 以 用 十 六 进 制 格 式 赋 值 。 例 如 , 将 num 设 置 为0xFF 可 能 会 有 助 于 缩 短 ROM 编 程 时 间 。 如 果 num 大 于 0xFF, 则 填 充字 节 将 设 置 为 (char)num。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-21


链 接 器 命 令 语 法注 意填 充 只 能 插 入 :• 载 入 区 中 。 在 载 入 区 之 间 没 有 填 充 。• 固 定 执 行 区 之 间 ( 除 了 强 制 对 齐 之 外 )。 填 充 不 能 插 入 已 达 到最 大 长 度 的 载 入 区 , 除 非 其 顶 部 有 固 定 的 执 行 区 。• 节 之 间 , 以 确 保 它 们 遵 循 对 齐 约 束 。--pltgot=type指 定 对 应 于 不 同 BPABI 寻 址 模 式 而 使 用 的 过 程 链 接 表 (PLT) 类 型和 全 局 偏 移 表 (GOT) 类 型 。其 中 type 为 下 列 项 之 一 :none 将 对 导 入 符 号 的 引 用 添 加 为 动 态 重 定 位 , 供 平 台 特 定 的后 链 接 器 处 理 。direct 将 对 导 入 符 号 的 引 用 解 析 为 指 向 导 入 符 号 的 只 读 指 针 。这 些 是 直 接 指 针 引 用 。 使 用 选 项 --bpabi 或 --dll 时 , 这 是缺 省 设 置 。indirect 链 接 器 将 为 导 入 的 符 号 创 建 GOT 并 在 可 能 情 况 下 创 建PLT 条 目 。 该 引 用 指 向 PLT 或 GOT 条 目 。sbrel--pltgot_opts=mode--[no_]remove与 indirect 的 引 用 相 同 , 但 有 一 项 例 外 。 GOT 条 目 将 作 为偏 移 量 存 储 , 该 偏 移 量 是 运 行 时 在 R9 中 保 留 的 段 的 静 态基 址 的 偏 移 量 。在 生 成 PLT 条 目 时 启 用 或 禁 用 弱 引 用 。其 中 mode 为 下 列 项 之 一 :weakrefs弱 引 用 生 成 PLT 条 目 。 这 些 引 用 必 须 在 后 面 的 链 接 阶 段中 解 析 。noweakrefs为 函 数 调 用 生 成 NOP, 或 为 数 据 生 成 零 。 不 生 成 PLT 条目 。 对 导 入 符 号 的 弱 引 用 保 留 为 未 解 析 状 态 。启 用 或 禁 用 从 映 像 中 删 除 未 使 用 的 输 入 节 。 如 果 输 入 节 包 含 映 像入 口 点 , 或 者 被 已 使 用 节 引 用 , 则 认 为 它 是 已 使 用 节 。 缺 省 为--remove。 有 关 详 细 信 息 , 另 请 参 阅 第 3-11 页 的 未 使 用 节 删 除 。2-22 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法--runpath pathlist--soname name--[no_]startup symbol--symver_script file--symver_soname在 调 试 时 使 用 --no_remove 可 在 最 终 映 像 中 保 留 所 有 输 入 节 ( 即 使 它们 是 未 使 用 的 )。使 用 --keep 选 项 可 在 正 常 构 建 中 保 留 指 定 节 。指 定 要 添 加 到 搜 索 路 径 的 路 径 列 表 ,Linux 动 态 链 接 器 使 用 该 路 径来 搜 索 此 映 像 / 共 享 对 象 所 需 的 共 享 对 象 。pathlist 是 用 逗 号 分 隔 的 路 径 列 表 。 指 定 多 个 路 径 名 时 , 在 逗 号 和路 径 名 之 间 不 要 留 有 空 格 , 例 如 path1,path2,path3,...,pathn。指 定 共 享 对 象 运 行 时 名 称 , 该 名 称 由 链 接 到 此 共 享 对 象 的 任 何 对 象用 作 相 关 性 名 称 。 此 相 关 性 存 储 在 链 接 器 生 成 的 可 执 行 文 件 中 。有 关 详 细 信 息 , 请 参 阅 第 6 章 BPABI 和 System V 共 享 库 和 可 执 行 文件 。--startup symbol 使 链 接 器 可 以 使 用 带 有 不 同 启 动 符 号 的 备 选 C 库 。缺 省 情 况 下 ,symbol 设 置 为 __main。--no_startup 选 项 不 使 用 symbol 自 变 量 。如 果 存 在 对 由 C 库 启 动 代 码 定 义 的 符 号 的 引 用 , 则 链 接 器 将 包 括 C库 启 动 代 码 。 此 符 号 引 用 称 为 启 动 符 号 。 它 在 链 接 器 发 现 main()的 定 义 时 自 动 创 建 。 使 用 --startup 选 项 可 以 更 改 此 符 号 引 用 。• 如 果 链 接 器 找 到 了 main() 的 定 义 , 但 找 不 到 对 symbol 的 引 用( 或 定 义 ), 则 链 接 器 会 生 成 错 误 。• 如 果 链 接 器 找 到 了 main() 的 定 义 和 对 symbol 的 引 用 ( 或 定义 ), 但 没 有 指 定 入 口 点 , 则 链 接 器 将 生 成 警 告 。 有 关 详 细 信息 , 请 参 阅 第 2-15 页 的 控 制 映 像 内 容 中 的 --entry location。打 开 隐 式 符 号 版 本 控 制 并 使 您 可 以 将 file 指 定 为 符 号 版 本 脚 本 。有 关 详 细 信 息 , 请 参 阅 第 4-22 页 的 符 号 版 本 控 制 。打 开 隐 式 符 号 版 本 控 制 并 使 您 可 以 版 本 化 符 号 以 强 制 实 施 静 态 绑定 。 如 果 符 号 没 有 已 定 义 的 版 本 , 链 接 器 将 使 用 所 链 接 的 文 件 的SONAME。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-23


链 接 器 命 令 语 法如 果 要 生 成 BPABI 兼 容 的 可 执 行 文 件 , 但 其 中 未 使 用 选 项--symver_script 指 定 版 本 脚 本 , 则 这 是 缺 省 设 置 。有 关 详 细 信 息 , 请 参 阅 第 4-22 页 的 符 号 版 本 控 制 和 《<strong>ARM</strong> 体 系 结 构的 基 础 平 台 ABI》(BPABI)。--[no_]tailreorder--tailreorder 在 可 能 的 情 况 下 将 尾 调 用 节 移 到 紧 靠 其 目 标 的 前 面 ,以 优 化 节 末 尾 的 跳 转 指 令 。 尾 调 用 节 是 在 节 的 末 尾 包 含 跳 转 指 令的 节 。 跳 转 必 须 具 有 在 节 的 开 始 位 置 定 位 函 数 的 重 定 位 信 息 。 此 选项 有 限 制 。 链 接 器 :• 只 能 为 每 个 尾 调 用 目 标 移 动 一 个 尾 调 用 节• 不 能 将 尾 调 用 节 移 动 到 其 执 行 区 之 外• 不 会 将 尾 调 用 节 移 动 到 内 联 胶 合 代 码 之 前 。--vfemode=mode有 关 处 理 尾 调 用 节 的 详 细 信 息 , 请 参 阅 第 3-20 页 的 跳 转 内 联 。--no_tailreorder 是 缺 省 值 。虚 函 数 删 除 (VFE) 是 一 种 使 链 接 器 可 以 识 别 更 多 未 使 用 节 的 技 术 。使 用 --vfemode=mode 可 指 定 如 何 删 除 这 些 内 容 和 运 行 时 类 型 信 息(RTTI) 对 象 。其 中 mode 为 下 列 项 之 一 :• on• off• force• force_no_rtti有 关 详 细 信 息 , 请 参 阅 第 3-11 页 的 未 使 用 函 数 删 除 。2.2.9 控 制 胶 合 代 码 生 成以 下 这 些 选 项 控 制 胶 合 代 码 的 生 成 :--[no_]inlineveneer允 许 或 禁 止 生 成 内 联 胶 合 代 码 , 更 好 地 控 制 链 接 器 如 何 放 置 节 。--inlineveneer 是 缺 省 值 。2-24 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法--[no_]piveneer允 许 或 禁 止 生 成 从 PI 代 码 到 绝 对 代 码 的 调 用 的 胶 合 代 码 。 使 用--no_piveneer 时 , 如 果 链 接 器 检 测 到 从 PI 代 码 到 绝 对 代 码 的 调 用 ,则 生 成 一 则 错 误 消 息 。 有 关 详 细 信 息 , 请 参 阅 第 3-17 页 的 “PI 到 绝对 ” 胶 合 代 码 。--piveneer 是 缺 省 值 。--[no_]veneershare启 用 或 禁 用 胶 合 代 码 共 享 。 胶 合 代 码 共 享 可 以 显 著 地 减 小 映 像 大小 。--veneershare 是 缺 省 值 。有 关 详 细 信 息 , 请 参 阅 第 3-18 页 的 胶 合 代 码 生 成 。2.2.10 指 定 字 节 寻 址 模 式以 下 选 项 控 制 字 节 寻 址 模 式 :--be8 指 定 <strong>ARM</strong>v6 字 节 固 定 寻 址 大 端 模 式 。这 是 <strong>ARM</strong>v6 大 端 映 像 的 缺 省 字 节 寻 址 模 式 , 意 味 着 链 接 器 反 转 指令 的 端 序 , 提 供 已 按 大 端 模 式 编 译 / 汇 编 的 输 入 对 象 的 小 端 代 码 和大 端 数 据 。字 节 固 定 寻 址 模 式 只 在 支 持 <strong>ARM</strong>v6 和 更 高 版 本 的 <strong>ARM</strong> 处 理 器 上可 用 。--be32指 定 遗 留 字 固 定 寻 址 大 端 模 式 , 即 与 <strong>ARM</strong>v6 之 前 的 大 端 映 像 相同 。 这 会 生 成 大 端 代 码 和 数 据 。字 固 定 寻 址 模 式 是 所 有 <strong>ARM</strong>v6 之 前 的 大 端 映 像 的 缺 省 模 式 。有 关 端 支 持 的 详 细 信 息 , 请 参 阅 :• 《 编 译 器 用 户 指 南 》 中 的 第 4-39 页 的 对 <strong>ARM</strong> 体 系 结 构 v6 的 支 持• 《<strong>ARM</strong> 体 系 结 构 参 考 手 册 》。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-25


链 接 器 命 令 语 法2.2.11 生 成 与 映 像 相 关 的 信 息除 --callgraph 之 外 , 缺 省 情 况 下 链 接 器 会 在 标 准 输 出 流 stdout 中 输 出 请 求 的 信息 。 您 可 以 使 用 --list 命 令 行 选 项 将 信 息 重 定 向 到 文 本 文 件 。以 下 选 项 控 制 如 何 提 取 并 呈 现 映 像 的 相 关 信 息 :--[no_]callgraph--callgraph 创 建 函 数 的 静 态 调 用 图 。 这 与 生 成 的 映 像 保 存 在 同 一 目录 中 。 调 用 图 将 为 映 像 中 的 所 有 函 数 提 供 定 义 和 参 考 信 息 。注 意如 果 链 接 器 要 计 算 函 数 堆 栈 的 使 用 情 况 , 则 在 汇 编 程 序 文 件 中 定 义的 任 意 函 数 必 须 具 有 合 适 的 PROC/ENDP 和 FRAME PUSH/POP 指 令 。对 于 每 个 函 数 func, 链 接 器 列 出 以 下 内 容 :• 编 译 函 数 的 处 理 器 状 态 (<strong>ARM</strong> 或 Thumb)• 调 用 func 的 函 数 集 合• func 调 用 的 函 数 集 合• 映 像 中 使 用 func 地 址 的 次 数 。此 外 , 调 用 图 将 标 识 以 下 函 数 :• 通 过 交 互 操 作 胶 合 代 码 调 用 的 函 数• 在 映 像 外 定 义 的 函 数• 允 许 保 持 未 定 义 状 态 的 函 数 ( 弱 引 用 )。静 态 调 用 图 还 提 供 有 关 堆 栈 的 使 用 信 息 。 其 中 列 出 :• 每 个 函 数 使 用 的 堆 栈 帧 的 大 小• 在 所 有 调 用 序 列 ( 即 所 有 非 循 环 函 数 调 用 链 ) 中 , 函 数 使 用 的堆 栈 的 最 大 大 小 。如 果 有 循 环 , 或 者 链 接 器 在 调 用 链 中 检 测 到 不 带 有 堆 栈 大 小 信 息 的函 数 , 则 将 + Unknown 添 加 至 堆 栈 使 用 情 况 中 。 将 会 添 加 一 条 原 因 以指 示 堆 栈 使 用 情 况 未 知 的 原 因 。如 果 没 有 函 数 调 试 帧 信 息 , 链 接 器 将 报 告 缺 少 堆 栈 帧 信 息 。对 于 间 接 函 数 , 链 接 器 不 能 可 靠 地 确 定 哪 个 函 数 发 出 了 间 接 调 用 。这 可 能 会 影 响 为 调 用 链 计 算 最 大 堆 栈 用 量 的 方 式 。 链 接 器 列 出 映像 中 使 用 的 所 有 函 数 指 针 。在 汇 编 语 言 代 码 中 使 用 帧 指 令 可 描 述 代 码 使 用 堆 栈 的 情 况 。 这 些指 令 确 保 向 调 试 器 提 供 调 试 帧 信 息 , 以 执 行 堆 栈 展 开 或 配 置 报 告 。2-26 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法有 关 如 何 确 定 堆 栈 使 用 情 况 的 详 细 信 息 , 请 参 阅 《 汇 编 程 序 指 南 》中 介 绍 指 令 参 考 的 章 节 。--callgraph_file=filename--callgraph_output=fmt--cgfile=type--cgsymbol=type--cgundefined=type--feedback file控 制 调 用 图 的 输 出 名 filename。 例 如 :--callgraph_file=myfile缺 省 的 filename 与 映 像 相 同 。 输 出 格 式 由 --callgraph_output=fmt 选项 控 制 。控 制 调 用 图 的 输 出 格 式 , 其 中 fmt 可 以 是 以 下 项 之 一 :html 以 HTML 格 式 输 出 调 用 图 。 这 是 缺 省 设 置 。text 以 纯 文 本 格 式 输 出 调 用 图 。控 制 调 用 图 中 包 括 的 内 容 , 其 中 type 可 以 是 以 下 项 之 一 :all 包 括 所 有 文 件 的 符 号 。 这 是 缺 省 设 置 。user 只 包 括 用 户 定 义 的 对 象 和 库 中 的 符 号 。system 只 包 括 系 统 库 中 的 符 号 。控 制 调 用 图 中 包 括 的 内 容 , 其 中 type 可 以 是 以 下 项 之 一 :all 包 括 局 部 符 号 和 全 局 符 号 。 这 是 缺 省 设 置 。locals 只 包 括 局 部 符 号 。globals 只 包 括 全 局 符 号 。控 制 调 用 图 中 包 括 的 内 容 , 其 中 type 可 以 是 以 下 项 之 一 :all 包 括 未 定 义 弱 引 用 的 函 数 条 目 和 调 用 。 这 是 缺 省 设 置 。entries 包 括 未 定 义 弱 引 用 的 函 数 条 目 。calls 包 括 对 未 定 义 弱 引 用 的 调 用 。none 在 输 出 中 忽 略 所 有 未 定 义 的 弱 引 用 。生 成 反 馈 文 件 , 以 便 在 下 次 编 译 文 件 时 提 示 编 译 器 有 未 使 用 的 函数 。下 次 编 译 文 件 时 , 使 用 编 译 器 选 项 --feedback file 指 定 要 使 用 的 反馈 文 件 。 未 使 用 函 数 放 置 在 各 自 所 在 的 节 中 , 以 便 链 接 器 可 能 在 未来 进 行 删 除 。 有 关 如 何 使 用 反 馈 文 件 的 信 息 , 请 参 阅 第 3-13 页 的 链接 器 反 馈 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-27


链 接 器 命 令 语 法--feedback_image option--info topics更 改 链 接 器 在 写 入 反 馈 文 件 时 的 行 为 。 在 通 常 无 法 创 建 可 执 行 ELF映 像 的 情 况 下 , 使 用 此 选 项 可 生 成 反 馈 文 件 。 例 如 , 如 果 在 删 除 未使 用 的 函 数 之 前 , 代 码 不 适 合 分 散 文 件 中 所 描 述 的 区 限 制 , 则 使 用--feedback_image noerrors。其 中 option 可 以 是 以 下 之 一 :nonenoerrorssimplefull使 用 分 散 加 载 文 件 。 禁 用 区 重 叠 和 区 大 小 溢 出 消 息 。 不写 入 ELF 映 像 。 如 果 区 溢 出 了 32 位 地 址 空 间 , 则 仍 会 生成 错 误 消 息 。使 用 分 散 加 载 文 件 。 发 出 区 重 叠 和 区 大 小 溢 出 警 告 消息 。 写 入 可 能 无 法 执 行 的 ELF 映 像 。 如 果 区 溢 出 了 32 位地 址 空 间 , 则 仍 会 生 成 错 误 消 息 。忽 略 分 散 加 载 文 件 。 禁 用 ROPI/RWPI 错 误 和 警 告 。 写 入可 能 无 法 执 行 的 ELF 映 像 。启 用 所 有 错 误 和 警 告 消 息 , 并 写 入 有 效 的 ELF 映 像 。 这是 缺 省 选 项 。输 出 关 于 指 定 主 题 的 信 息 , 其 中 topics 是 由 逗 号 分 隔 的 主 题 关 键 字列 表 。 主 题 关 键 字 可 以 是 以 下 之 一 :architecturecommondebugexceptionsinline通 过 列 出 CPU、FPU 和 字 节 顺 序 来 简 要 说 明 映 像 体 系 结构 。列 出 从 映 像 中 删 除 的 所 有 公 共 节 。 使 用 此 选 项 相 当 于--info common,totals。列 出 因 使 用 --remove 而 从 映 像 中 删 除 的 所 有 被 拒 绝 的 输入 调 试 节 。 使 用 此 选 项 相 当 于 --info debug,totals。提 供 异 常 表 生 成 和 优 化 的 信 息 。列 出 由 链 接 器 内 联 的 所 有 函 数 以 及 内 联 的 总 数 ( 如 果 使用 了 --inline)。 有 关 跳 转 内 联 的 详 细 信 息 , 请 参 阅第 3-20 页 的 跳 转 内 联 。inputs 列 出 输 入 符 号 、 对 象 和 库 。libraries 列 出 为 链 接 阶 段 自 动 选 择 的 每 个 库 的 完 整 路 径 名 。2-28 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法pltgotsizes可 以 将 此 选 项 与 修 饰 符 --info_lib_prefix 一 起 使 用 , 以 显示 有 关 特 定 库 的 信 息 。 例 如 , 使 用 以 下 选 项 标 识 链 接 器使 用 的 浮 点 库 :--info libraries --info_lib_prefix=f。列 出 为 可 执 行 文 件 或 DLL 构 建 的 PLT 条 目 。列 出 映 像 中 每 个 输 入 对 象 和 库 成 员 的 代 码 和 数 据 (RO 数据 、RW 数 据 、ZI 数 据 和 调 试 数 据 ) 大 小 。 使 用 此 选 项 相当 于 --info sizes,totals。stack 列 出 所 有 全 局 符 号 的 堆 栈 使 用 情 况 。summarysizessummarystacktailreorder简 要 说 明 映 像 的 代 码 和 数 据 大 小 。简 要 说 明 所 有 全 局 符 号 的 堆 栈 使 用 情 况 。列 出 因 为 使 用 --tailreorder 而 移 动 到 其 目 标 上 方 的 所 有尾 调 用 节 。 有 关 处 理 尾 调 用 节 的 详 细 信 息 , 请 参 阅第 3-20 页 的 跳 转 内 联 。totals 列 出 输 入 对 象 和 库 的 代 码 和 数 据 (RO 数 据 、RW 数 据 、ZI数 据 和 调 试 数 据 ) 的 总 大 小 。unused 列 出 因 使 用 --remove 而 从 映 像 中 删 除 的 所 有 未 使 用 节 。veneersveneercallers列 出 链 接 器 生 成 的 胶 合 代 码 。 有 关 详 细 信 息 , 请 参 阅第 3-18 页 的 胶 合 代 码 生 成 。列 出 链 接 器 生 成 的 胶 合 代 码 , 包 括 每 个 胶 合 代 码 的 调 用者 的 附 加 信 息 。 与 --verbose 结 合 使 用 , 单 独 列 出 每 个 调用 。 有 关 详 细 信 息 , 请 参 阅 第 3-18 页 的 胶 合 代 码 生 成 。--info sizes,totals 的 输 出 始 终 在 输 入 对 象 和 库 的 总 大 小 中 包 含 填充 值 。如 果 使 用 RW 数 据 压 缩 ( 缺 省 设 置 ), 或 已 使 用 --datacompressor id选 项 指 定 了 压 缩 器 , 则 --info sizes,totals 的 输 出 将 在 Grand Totals下 方 包 括 一 个 条 目 , 反 映 映 像 的 真 实 大 小 。注 意列 中 的 关 键 字 之 间 不 允 许 有 空 格 。 例 如 , 您 可 以 输 入 --infosizes,totals, 但 不 能 输 入 --info sizes, totals。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-29


链 接 器 命 令 语 法有 关 详 细 信 息 , 请 参 阅 第 3-31 页 的 获 得 有 关 映 像 的 信 息 。--[un]mangled指 示 链 接 器 在 诊 断 消 息 中 显 示 重 整 或 未 重 整 的 C++ 符 号 名 , 并 在--xref、--xreffrom、--xrefto 和 --symbols 选 项 生 成 的 列 表 中 显 示 这些 符 号 名 。--unmangled 是 缺 省 值 。 这 意 味 着 链 接 器 不 重 整 C++ 符 号 名 , 因 此 它们 以 源 代 码 中 的 方 式 显 示 。如 果 选 择 了 --mangled, 则 链 接 器 重 整 C++ 符 号 名 。 因 此 , 显 示 的 符号 名 与 对 象 符 号 表 中 的 相 同 。--[no_]map--map 创 建 映 像 映 射 。 映 射 包 含 映 像 中 每 个 载 入 区 、 执 行 区 和 输 入节 ( 包 括 链 接 器 生 成 的 输 入 节 ) 的 地 址 和 大 小 。--[no_]symbols--symbols 列 出 链 接 步 骤 中 使 用 的 每 个 局 部 符 号 和 全 局 符 号 以 及 相应 的 值 。注 意这 不 包 括 映 射 符 号 。 使 用 --list_mapping_symbols 可 在 输 出 中 包 括 映射 符 号 。--[no_]list_mapping_symbols--symdefs file--list_mapping_symbols 在 --symbols 生 成 的 输 出 中 包 括 映 射 符 号 。 例如 :$a <strong>ARM</strong> 代 码$t Thumb 代 码$d 数 据 。映 射 符 号 用 于 标 记 <strong>ARM</strong> 代 码 、Thumb 代 码 和 数 据 之 间 的 转 换 。 有关 详 细 信 息 , 请 参 阅 《<strong>ARM</strong> 体 系 结 构 的 ELF》(AAELF)。从 输 出 映 像 创 建 包 含 全 局 符 号 定 义 的 文 件 。缺 省 情 况 下 , 所 有 全 局 符 号 都 写 入 到 symdefs 文 件 中 。 如 果 名 为file 的 symdefs 文 件 已 经 存 在 , 则 链 接 器 将 其 输 出 限 制 为 此 文 件 中已 列 出 的 符 号 。2-30 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法注 意如 果 不 希 望 出 现 此 行 为 , 请 确 保 在 链 接 步 骤 之 前 删 除 任 何 现 有 的symdefs 文 件 。如 果 指 定 的 file 不 带 路 径 信 息 , 则 链 接 器 将 在 写 入 输 出 映 像 的 目 录中 搜 索 它 。 如 果 未 找 到 该 文 件 , 则 在 该 目 录 中 创 建 它 。在 与 其 他 映 像 链 接 时 , 可 以 将 符 号 定 义 文 件 用 作 输 入 。 有 关 详 细 信息 , 请 参 阅 第 4-8 页 的 访 问 其 他 映 像 中 的 符 号 。--[no_]xref --xref 列 出 输 入 节 之 间 的 所 有 交 叉 引 用 。--[no_]xrefdbg--xrefdbg 列 出 输 入 调 试 节 之 间 的 所 有 交 叉 引 用 。--xref{from|to} object(section)列 出 交 叉 引 用 :• 从 object 中 的 输 入 section 到 其 他 输 入 节• 从 其 他 输 入 节 到 object 中 的 输 入 section。如 果 想 知 道 来 自 / 指 向 特 定 输 入 节 的 引 用 , 则 使 用 --xref 链 接 器 选项 生 成 的 列 表 子 集 会 很 有 用 。 可 以 多 次 使 用 此 选 项 , 列 出 来 自 / 指向 多 个 输 入 节 的 引 用 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-31


链 接 器 命 令 语 法2.2.12 控 制 链 接 器 诊 断 消 息这 些 选 项 控 制 链 接 器 发 出 诊 断 消 息 的 方 式 :--diag_style arm|ide|gnu更 改 警 告 和 错 误 消 息 的 格 式 。--diag_style arm 为 缺 省值 ,--diag_style gnu 与 由 gcc 报 告 的 格 式 相 匹 配 , 而 --diag_styleide 与 由 Microsoft Visual Studio 报 告 的 格 式 相 匹 配 。--diag_suppress taglist--diag_warning taglist--errors file禁 用 所 有 具 有 指 定 标 签 的 诊 断 消 息 。此 选 项 需 要 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 禁 止 显 示的 消 息 。 例 如 , 要 禁 止 显 示 编 号 为 L6314W 和 L6305W 的 警 告 消 息 , 请使 用 以 下 命 令 :armlink --diag_suppress L6314,L6305 ...设 置 具 有 指 定 标 签 的 诊 断 消 息 , 使 其 作 为 警 告 消 息 显 示 , 例 如 , 在希 望 降 级 错 误 消 息 的 情 况 下 。此 选 项 需 要 以 逗 号 分 隔 的 诊 断 消 息 编 号 列 表 , 用 于 指 定 要 降 级 的 消息 。将 诊 断 消 息 从 标 准 错 误 流 重 定 向 到 file。指 定 的 文 件 在 链 接 阶 段 开 始 时 创 建 。 如 果 已 存 在 同 名 的 文 件 , 则 清除 它 。如 果 指 定 file 时 不 带 路 径 信 息 , 则 将 在 当 前 目 录 中 创 建 该 文 件 。--list file--verbose将 --info、--map、--symbols、--verbose、--xref、--xreffrom 和--xrefto 命 令 的 输 出 中 的 诊 断 消 息 重 定 向 到 file。输 出 诊 断 消 息 时 创 建 指 定 的 文 件 。 如 果 已 存 在 同 名 的 文 件 , 则 覆 盖它 。 不 过 , 如 果 不 输 出 诊 断 消 息 , 则 不 创 建 文 件 。 这 种 情 况 下 , 任何 现 有 的 同 名 文 件 的 内 容 将 保 持 不 变 。如 果 指 定 的 file 不 带 路 径 信 息 , 则 将 在 输 出 目 录 ( 即 写 入 输 出 映 像的 目 录 ) 中 创 建 该 文 件 。输 出 关 于 链 接 操 作 的 详 细 信 息 , 包 括 所 包 含 的 对 象 和 从 中 提 取 对 象的 库 。 因 为 此 输 出 通 常 很 长 , 所 以 可 能 需 要 将 此 命 令 与 --list file命 令 结 合 使 用 , 将 信 息 重 定 向 到 file。2-32 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


链 接 器 命 令 语 法使 用 --verbose 可 将 诊 断 消 息 输 出 到 stdout。诊 断 消 息 中 的 前 缀 字 母RVCT 工 具 会 自 动 将 标 识 字 母 插 入 到 诊 断 消 息 中 , 如 表 2-1 中 所 述 。 借 助 这 些 前缀 字 母 ,RVCT 工 具 可 使 用 重 叠 的 消 息 范 围 。表 2-1 标 识 诊 断 消 息前 缀 字 母CALQRVCT 工 具armccarmasmarmlink 或 armarfromelf以 下 规 则 适 用 :• 无 前 缀 的 消 息 编 号 可 由 所 有 RVCT 工 具 处 理 。• 有 前 缀 的 消 息 编 号 仅 由 具 有 匹 配 前 缀 的 工 具 处 理 。• 工 具 不 处 理 不 具 有 匹 配 前 缀 的 消 息 。因 此 , 链 接 器 前 缀 L 可 以 与 --diag_error、--diag_remark 和 --diag_warning 结 合 使用 , 或 在 禁 止 显 示 消 息 时 使 用 , 例 如 :armlink --diag_suppress L6314,L6305 ...2.2.13 使 用 via 文 件使 用 以 下 选 项 可 以 指 定 包 含 附 加 链 接 器 命 令 行 参 数 的 via 文 件 :--via file 从 file 中 读 取 输 入 文 件 名 和 链 接 器 选 项 的 详 细 列 表 。可 以 在 链 接 器 命 令 行 中 输 入 多 个 --via 选 项 。--via 选 项 也 可 以 包 括在 via 文 件 中 。有 关 编 写 via 文 件 的 详 细 信 息 , 请 参 阅 《 编 译 器 参 考 指 南 》 中 的 第 A-2 页 的 via 文件 概 述 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 2-33


链 接 器 命 令 语 法2.2.14 其 他2.2.15 控 制 与 遗 留 对 象 的 兼 容 性--[no_]legacyalign缺 省 情 况 下 , 链 接 器 假 定 执 行 区 和 载 入 区 是 四 字 节 对 齐 的 。 这 使 链接 器 可 以 将 插 入 到 映 像 中 的 填 充 数 量 减 至 最 小 。--no_legacyalign 选 项 指 示 链 接 器 插 入 填 充 以 强 制 自 然 对 齐 。 使 用此 选 项 可 确 保 严 格 遵 循 ELF 规 范 。 有 关 详 细 信 息 , 请 参 阅 第 3-7 页的 节 布 局 。RVCT v3.1 中 的 ABI 不 同 于 RVCT v1.2 中 的 ABI。 因 此 ,RVCT v1.2 遗 留 对 象 和库 不 直 接 与 RVCT v3.1 兼 容 。有 关 详 细 信 息 , 请 参 阅 《 库 指 南 》 中 的 第 1-3 页 的 用 于 实 现 <strong>ARM</strong> 体 系 结 构 兼 容 性的 ABI, 以 及 《<strong>RealView</strong> 编 译 工 具 要 点 指 南 》 中 关 于 与 遗 留 对 象 和 库 的 兼 容 性 的章 节 。2-34 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


第 3 章使 用 基 本 链 接 器 功 能本 章 介 绍 了 随 RVCT 一 起 提 供 的 <strong>ARM</strong> 链 接 器 armlink 中 可 用 的 基 本 功 能 。 它 包含 以 下 几 节 :• 第 3-2 页 的 指 定 映 像 结 构• 第 3-7 页 的 节 布 局• 第 3-10 页 的 优 化 和 修 正• 第 3-24 页 的 使 用 命 令 行 选 项 创 建 简 单 映 像• 第 3-30 页 的 使 用 命 令 行 选 项 处 理 C++ 异 常• 第 3-31 页 的 获 得 有 关 映 像 的 信 息有 关 链 接 器 高 级 功 能 的 信 息 , 请 参 阅 :• 第 4 章 访 问 映 像 符 号 中 有 关 如 何 访 问 符 号 的 说 明• 第 5 章 使 用 分 散 加 载 描 述 文 件 中 有 关 如 何 使 用 分 散 加 载 的 说 明<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-1


使 用 基 本 链 接 器 功 能3.1 指 定 映 像 结 构映 像 的 结 构 由 以 下 各 项 定 义 :• 映 像 的 组 成 区 和 输 出 节 的 数 量• 加 载 映 像 时 这 些 区 和 节 在 内 存 中 的 位 置• 执 行 映 像 时 这 些 区 和 节 在 内 存 中 的 位 置描 述 内 存 映 射 时 :• 术 语 根 区 域 用 于 描 述 加 载 地 址 和 执 行 地 址 相 同 的 区 。• 载 入 区 相 当 于 ELF 段 。3.1.1 对 象 和 映 像 的 构 建 块可 执 行 文 件 由 映 像 、 区 、 输 出 节 和 输 入 节 的 层 次 结 构 构 成 :• 映 像 由 一 个 或 多 个 区 组 成 。 每 个 区 由 一 个 或 多 个 输 出 节 组 成 。• 每 个 输 出 节 包 含 一 个 或 多 个 输 入 节 。• 输 入 节 是 目 标 文 件 中 的 代 码 和 数 据 信 息 。第 3-2 页 的 图 3-1 显 示 了 区 、 输 出 节 和 输 入 节 之 间 的 关 系 。Input section 1.1.1Input section 1.1.2Region 1Output section 1.1Output section 1.2Output section 1.3Input section 1.2.1Input section 1.3.1Input section 1.3.2Region 2 Output section 2.1Input section 2.1.1Input section 2.1.2Input section 2.1.2Memory图 3-1 构 建 映 像 块3-2 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能图 3-1 显 示 了 构 成 映 像 的 构 建 块 :输 入 节输 出 节区输 入 节 包 含 代 码 、 初 始 化 数 据 , 或 描 述 未 初 始 化 的 或 在 映 像 执 行 前必 须 设 为 0 的 内 存 片 断 。 这 些 特 性 通 过 RO、RW 和 ZI 这 样 的 属 性来 表 示 。 有 关 详 细 信 息 , 请 参 阅 第 3-8 页 的 按 属 性 排 序 输 入 节 。armlink 使 用 这 些 属 性 , 将 输 入 节 组 织 到 称 为 输 出 节 和 区 的 更 大 的构 建 块 中 。一 个 输 出 节 由 若 干 个 具 有 相 同 RO、RW 或 ZI 属 性 的 相 邻 输 入 节 组成 。 输 出 节 的 属 性 与 组 成 它 的 输 入 节 的 属 性 相 同 。 在 输 出 节 中 , 输入 节 根 据 第 3-7 页 的 节 布 局 中 描 述 的 规 则 进 行 排 序 。一 个 区 由 一 个 、 两 个 或 三 个 相 邻 的 输 出 节 组 成 。 区 中 的 输 出 节 根 据其 属 性 排 序 。 首 先 是 RO 输 出 节 , 然 后 是 RW 输 出 节 , 最 后 是 ZI 输出 节 。 区 通 常 映 射 到 物 理 内 存 设 备 , 如 ROM、RAM 或 外 围 设 备 。3.1.2 映 像 的 加 载 视 图 和 执 行 视 图映 像 区 在 加 载 时 放 入 系 统 内 存 映 射 。 在 执 行 映 像 之 前 , 您 可 能 要 将 它 的 一 些 区移 到 执 行 地 址 并 创 建 ZI 输 出 节 。 例 如 , 必 须 将 已 初 始 化 的 RW 数 据 从 ROM 中 的加 载 地 址 复 制 到 RAM 中 的 执 行 地 址 。映 像 的 内 存 映 射 具 有 以 下 不 同 的 视 图 ( 如 图 3-2 中 所 示 )。加 载 视 图根 据 映 像 加 载 到 内 存 时 所 在 的 地 址 ( 即 映 像 开 始 执 行 之 前 的位 置 ) 来 描 述 每 个 映 像 的 区 和 节 。执 行 视 图 根 据 映 像 执 行 时 所 在 的 地 址 来 描 述 每 个 映 像 的 区 和 节 。Load view0x0FFFFExecution viewRAMROMRW sectionRO sectionMemory initializedto zero0x0A0000x080000x060000x00000ZI sectionRW sectionRO section图 3-2 加 载 和 执 行 内 存 映 射<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-3


使 用 基 本 链 接 器 功 能表 3-1 比 较 了 加 载 视 图 和 执 行 视 图 。表 3-1 比 较 加 载 视 图 和 执 行 视 图加 载 说 明 执 行 说 明加 载 地 址 在 包 含 节 或 区 的 映 像 开 始 执 行 之 前 ,节 或 区 加 载 到 内 存 中 的 地 址 。 节 或 非根 区 的 加 载 地 址 可 以 与 其 执 行 地 址 不同 。执 行 地 址当 包 含 节 或 区 的 映 像 执 行 时 , 节 或 区 所在 的 地 址 。载 入 区 加 载 地 址 空 间 中 的 区 执 行 区 执 行 地 址 空 间 中 的 区3.1.3 指 定 映 像 的 内 存 映 射映 像 可 以 由 任 意 个 区 和 输 出 节 组 成 。 所 有 这 些 区 可 以 有 不 同 的 加 载 地 址 和 执 行地 址 。 要 构 建 映 像 的 内 存 映 射 ,armlink 必 须 有 以 下 各 项 信 息 :分 组 如 何 将 输 入 节 分 组 为 输 出 节 和 区 。布 局 在 内 存 映 射 中 如 何 安 排 映 像 区 的 位 置 。根 据 映 像 的 内 存 映 射 的 复 杂 程 度 , 有 两 种 方 法 可 将 此 信 息 传 递 到 armlink:使 用 命 令 行 选 项对 于 映 像 只 有 一 个 或 两 个 载 入 区 和 最 多 三 个 执 行 区 的 简 单 情 况 , 可以 使 用 以 下 选 项 :• --ro-base• --rw-base• --ropi• --rwpi• --split• --rosplit以 上 列 出 的 选 项 是 一 种 简 化 的 表 示 法 , 它 提 供 的 设 置 与 简 单 映 像 的分 散 加 载 描 述 相 同 。 有 关 详 细 信 息 , 请 参 阅 第 3-24 页 的 使 用 命 令 行选 项 创 建 简 单 映 像 。使 用 分 散 加 载 描 述 文 件对 于 需 要 对 映 像 组 件 的 分 组 和 布 局 进 行 全 面 控 制 的 较 复 杂 的 情 况 ,可 以 使 用 分 散 加 载 描 述 文 件 。 要 使 用 分 散 加 载 , 请 在 命 令 行 中 指 定--scatter filename。 这 些 内 容 在 第 5 章 使 用 分 散 加 载 描 述 文 件 中 有详 细 描 述 。3-4 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能3.1.4 映 像 入 口 点映 像 中 的 入 口 点 是 程 序 开 始 执 行 的 位 置 。 有 两 种 不 同 类 型 的 入 口 点 :初 始 入 口 点映 像 的 初 始 入 口 点 是 存 储 在 ELF 头 文 件 中 的 单 个 值 。 对 于 由 操 作系 统 或 引 导 加 载 程 序 将 程 序 加 载 到 RAM 的 情 况 , 加 载 程 序 通 过 将控 制 权 传 送 到 映 像 中 的 初 始 入 口 点 来 启 动 映 像 的 执 行 。一 个 映 像 只 能 有 一 个 初 始 入 口 点 。 初 始 入 口 点 可 以 是 ( 但 不 必 一 定是 ) 由 ENTRY 指 令 设 置 的 入 口 点 之 一 。由 ENTRY 指 令 设 置 的 入 口 点这 些 是 在 汇 编 语 言 源 代 码 中 使 用 ENTRY 指 令 设 置 的 入 口 点 。 在 嵌 入式 系 统 中 , 该 指 令 通 常 用 于 标 记 通 过 处 理 器 异 常 向 量 输 入 的 代 码 ,如 RESET、IRQ 和 FIQ。可 以 用 ENTRY 指 令 在 映 像 中 指 定 多 个 入 口 点 。 该 指 令 用 ENTRY 关 键字 标 记 输 出 代 码 节 , 指 示 链 接 器 在 执 行 未 使 用 节 删 除 时 不 能 删 除 该节 。对 于 C 和 C++ 程 序 ,C 库 中 的 __main() 函 数 也 是 入 口 点 。有 关 ENTRY 指 令 的 详 细 信 息 , 请 参 阅 汇 编 程 序 指 南 。如 果 嵌 入 式 映 像 用 于 加 载 程 序 , 则 它 必 须 在 头 文 件 中 指 定 单 个 初 始入 口 点 。 有 关 详 细 信 息 , 请 参 阅 指 定 初 始 入 口 点 。指 定 初 始 入 口 点可 以 用 --entry 链 接 器 选 项 指 定 初 始 入 口 点 。 --entry 选 项 只 能 指 定 一 次 。 有 关 详细 信 息 , 请 参 阅 第 2-5 页 的 armlink 命 令 语 法 中 的 说 明 。对 于 ROM 起 始 地 址 为 0 的 嵌 入 式 应 用 程 序 , 可 使 用 --entry 0x0( 或 对 于 有 高 位向 量 的 CPU, 可 以 使 用 0xFFFF0000)。初 始 入 口 点 必 须 满 足 以 下 条 件 :• 映 像 入 口 点 必 须 始 终 在 执 行 区 内• 执 行 区 必 须 是 非 重 叠 的 , 而 且 必 须 是 根 执 行 区 ( 加 载 地 址 与 执 行 地 址 相同 )。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-5


使 用 基 本 链 接 器 功 能如 果 不 使 用 --entry 选 项 指 定 初 始 入 口 点 , 则 :• 如 果 输 入 对 象 仅 包 含 一 个 由 ENTRY 指 令 设 置 的 入 口 点 , 则 链 接 器 将 使 用 该入 口 点 作 为 映 像 的 初 始 入 口 点• 在 以 下 情 况 时 , 链 接 器 生 成 不 包 含 初 始 入 口 点 的 映 像 :— 已 使 用 ENTRY 指 令 指 定 多 个 入 口 点— 未 使 用 ENTRY 指 令 指 定 任 何 入 口 点 。在 这 两 种 情 况 下 , 链 接 器 将 发 出 警 告 。使 用 --entry 指 定 唯 一 的 入 口 点 以 修 复 该 警 告 指 示 的 问 题 。3-6 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能3.2 节 布 局链 接 器 根 据 输 入 节 的 属 性 在 一 个 区 内 对 它 们 进 行 排 序 。 具 有 相 同 属 性 的 输 入 节在 区 内 形 成 相 邻 块 。每 个 输 入 节 的 基 址 由 链 接 器 定 义 的 排 序 顺 序 确 定 , 并 且 在 包 含 它 的 输 出 节 中 正确 对 齐 。通 常 , 生 成 映 像 时 链 接 器 按 以 下 顺 序 对 输 入 节 进 行 排 序 :1. 按 属 性 。2. 按 输 入 节 名 称 。3. 按 其 在 输 入 列 表 中 的 位 置 , 除 非 由 FIRST 或 LAST 覆 盖 。 请 参 阅 第 3-8 页 的 使用 FIRST 和 LAST 放 置 节 。注 意该 排 序 顺 序 不 受 在 分 散 文 件 或 目 标 文 件 名 中 的 排 序 的 影 响 。如 果 执 行 区 包 含 4MB 的 Thumb 代 码 、16MB 的 Thumb-2 代 码 或 超 过 32MB 的<strong>ARM</strong> 代 码 , 则 链 接 器 可 能 会 更 改 排 序 顺 序 , 从 而 将 长 跳 转 胶 合 代 码 的 数 量 减 至最 小 。 有 关 详 细 信 息 , 请 参 阅 第 3-18 页 的 胶 合 代 码 生 成 。在 缺 省 情 况 下 , 链 接 器 创 建 由 RO、RW 和 可 选 的 ZI 输 出 节 组 成 的 映 像 。 RO 输 出节 在 具 有 内 存 管 理 硬 件 的 系 统 上 运 行 时 可 以 受 到 保 护 。 RO 节 也 可 以 放 在 目 标 的ROM 中 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-7


使 用 基 本 链 接 器 功 能3.2.1 按 属 性 排 序 输 入 节部 分 映 像 集 合 在 一 起 , 形 成 最 小 数 量 的 相 邻 区 。armlink 按 如 下 属 性 对 输 入 节 排序 :1. 只 读 代 码2. 只 读 数 据3. 读 写 代 码4. 读 写 数 据5. 零 初 始 化 数 据 。具 有 相 同 属 性 的 输 入 节 按 名 称 排 序 。 名 称 是 区 分 大 小 写 的 , 并 且 使 用 ASCII 字符 排 列 顺 序 , 对 名 称 按 字 母 顺 序 进 行 比 较 。属 性 和 名 称 相 同 的 输 入 节 根 据 它 们 在 输 入 列 表 中 的 相 对 位 置 排 序 。这 些 规 则 意 味 着 库 中 包 含 的 属 性 和 名 称 相 同 的 输 入 节 的 位 置 是 无 法 断 定 的 。 如果 需 要 更 精 确 的 定 位 , 可 以 手 动 提 取 模 块 并 将 它 们 包 含 在 输 入 列 表 中 。3.2.2 使 用 FIRST 和 LAST 放 置 节在 区 内 , 所 有 RO 代 码 输 入 节 是 相 邻 的 并 形 成 RO 输 出 节 ,RO 输 出 节 必 须 在 包 含所 有 RW 输 入 节 的 输 出 节 之 前 。如 果 未 使 用 分 散 加 载 , 请 使 用 --first 和 --last 链 接 器 选 项 来 放 置 输 入 节 。如 果 使 用 分 散 加 载 而 且 布 局 顺 序 很 重 要 时 , 则 使 用 分 散 加 载 描 述 文 件 中 的 FIRST和 LAST 属 性 , 在 执 行 区 中 标 记 第 一 个 和 最 后 一 个 输 入 节 。但 是 ,FIRST 和 LAST 不 能 破 坏 在 按 属 性 排 序 输 入 节 中 描 述 的 基 本 的 属 性 排 列 顺序 。 例 如 ,FIRST RW 放 在 任 何 只 读 代 码 或 只 读 数 据 之 后 。3-8 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能3.2.3 对 齐 节排 序 输 入 节 之 后 和 修 复 基 址 之 前 ,armlink 根 据 需 要 插 入 填 充 , 以 强 制 每 个 输 入节 的 开 始 地 址 是 输 入 节 对 齐 的 倍 数 。<strong>ARM</strong> 链 接 器 允 许 ELF 程 序 头 文 件 和 输 出 节 在 四 字 节 边 界 对 齐 , 而 不 考 虑 输 入 节的 最 大 对 齐 要 求 。 这 样 使 armlink 可 以 将 插 入 映 像 的 填 充 数 量 最 小 化 。如 果 需 要 严 格 遵 循 ELF 规 范 , 则 使 用 --no_legacyalign 选 项 。 插 入 填 充 以 确 保 兼容 性 , 且 链 接 器 会 将 不 是 0 mod Max(input section alignment) 的 基 址 视 为 出 错 。可 以 使 用 ALIGN 来 扩 展 区 的 对 齐 , 例 如 , 将 通 常 按 4 字 节 的 对 齐 改 为 按 8 字 节 对齐 。 您 不 能 减 少 自 然 对 齐 , 例 如 , 强 制 将 通 常 按 4 字 节 的 对 齐 改 为 按 2 字 节 对齐 。 有 关 详 细 信 息 , 请 参 阅 第 5-44 页 的 在 页 面 边 界 上 创 建 区 。您 也 可 以 增 加 输 入 节 的 对 齐 。 请 参 阅 汇 编 程 序 指 南 的 指 令 参 考 中 的 ALIGN 的 说明 。3.2.4 排 序 包 含 Thumb 代 码 的 执 行 区Thumb 的 跳 转 范 围 为 4MB。 如 果 执 行 区 包 含 的 Thumb 代 码 超 过 4MB,armlink尝 试 将 平 均 调 用 深 度 相 近 的 节 排 序 , 并 将 最 常 调 用 的 节 放 置 在 中 间 。 这 有 助 于最 小 化 生 成 的 胶 合 代 码 数 量 。 有 关 详 细 信 息 , 请 参 阅 第 3-18 页 的 胶 合 代 码 生成 。Thumb-2 的 跳 转 范 围 为 16MB。 只 有 当 超 出 限 制 时 , 才 需 要 重 新 排 序 节 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-9


使 用 基 本 链 接 器 功 能3.3 优 化 和 修 正本 节 介 绍 了 重 复 节 、 未 使 用 的 节 、 调 试 节 、 胶 合 代 码 和 跳 转 的 链 接 器 优 化 , 还 介绍 了 如 何 使 用 链 接 器 反 馈 进 行 重 复 编 译 。3.3.1 公 共 调 试 节 删 除在 DWARF 2 中 , 编 译 器 和 汇 编 程 序 为 编 译 单 元 的 每 个 源 文 件 生 成 一 组 调 试 节 。armlink 可 以 检 测 到 特 定 源 文 件 中 调 试 节 的 多 个 副 本 , 并 且 在 最 终 的 映 像 中 只 保留 一 个 副 本 , 而 丢 弃 其 他 所 有 副 本 。 这 可 以 显 著 地 减 小 映 像 调 试 的 大 小 。在 DWARF 3 中 , 公 共 调 试 节 放 在 公 共 组 中 。armlink 将 只 保 留 每 组 中 具 有 相 同 签名 的 一 个 副 本 , 而 丢 弃 其 他 所 有 副 本 。3.3.2 公 共 组 或 节 删 除如 果 在 C++ 源 代 码 中 使 用 了 内 联 函 数 或 模 板 , 则 <strong>ARM</strong> 编 译 器 生 成 用 于 链 接 的 完整 对 象 , 因 此 每 个 对 象 都 包 含 其 需 要 的 内 联 函 数 和 模 板 函 数 的 外 联 副 本 。 当 在公 共 头 文 件 中 声 明 这 些 函 数 时 , 函 数 可 能 在 随 后 链 接 在 一 起 的 各 个 对 象 中 被 定义 多 次 。 为 了 删 除 重 复 副 本 , 编 译 器 会 将 这 些 函 数 编 译 到 公 共 代 码 节 或 组 的 单独 实 例 中 。公 共 代 码 节 或 组 的 单 独 实 例 可 能 不 同 。 例 如 , 可 能 在 库 中 找 到 某 些 副 本 , 它 们 已经 用 不 同 的 ( 但 兼 容 的 ) 编 译 选 项 、 不 同 的 优 化 选 项 或 不 同 的 调 试 选 项 进 行 编译 。如 果 副 本 不 同 , 则 armlink 根 据 输 入 对 象 的 属 性 保 留 每 个 公 共 代 码 节 或 组 的 最 常用 的 变 体 。armlink 将 丢 弃 其 他 变 体 。如 果 副 本 相 同 , 则 armlink 保 留 找 到 的 第 一 个 节 或 组 。此 优 化 可 由 以 下 链 接 器 选 项 控 制 :• 选 择 --bestdebug 选 项 可 使 用 最 大 的 Comdat 组 ( 可 能 提 供 最 佳 的 调 试 视图 )。• 选 择 --no_bestdebug 选 项 可 使 用 最 小 的 Comdat 组 ( 可 能 提 供 最 小 的 代 码 大小 )。 这 是 缺 省 设 置 。 在 大 多 数 情 况 下 , 使 用 --bestdebug 的 机 会 不 多 。由 于 --no_bestdebug 为 缺 省 值 , 因 此 不 管 您 在 使 用 --debug 编 译 时 是 否 生 成调 试 表 , 最 终 映 像 都 是 一 样 的 。有 关 详 细 信 息 , 请 参 阅 :— 《 编 译 器 用 户 指 南 》 中 的 第 4-17 页 的 内 联— 《 编 译 器 参 考 指 南 》 中 的 第 2-21 页 的 --[no_]debug。3-10 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能3.3.3 未 使 用 节 删 除未 使 用 节 删 除 是 指 从 最 终 的 映 像 中 删 除 从 未 执 行 的 代 码 或 与 代 码 无 关 的 数 据 。可 以 通 过 --remove、--no_remove、--first、--last 和 --keep 链 接 器 选 项 控 制 此 优化 。 使 用 --info unused 链 接 器 选 项 可 以 指 示 链 接 器 生 成 已 删 除 的 未 使 用 节 的 列表 。在 可 能 导 致 删 除 所 有 节 的 情 况 下 , 禁 止 删 除 未 使 用 节 。在 以 下 条 件 下 , 将 在 最 终 映 像 中 保 留 输 入 节 :• 输 入 节 包 含 入 口 点• 通 过 非 弱 引 用 从 包 含 入 口 点 的 输 入 节 直 接 或 间 接 引 用 输 入 节• 输 入 节 由 --first 或 --last 选 项 ( 或 等 效 的 分 散 加 载 ) 指 定 为 第 一 个 或 最 后一 个 输 入 节• 输 入 节 由 --keep 选 项 标 记 为 不 可 删 除 。注 意未 使 用 节 删 除 是 所 有 组 的 属 性 , 不 仅 仅 是 公 共 组 的 属 性 。3.3.4 未 使 用 函 数 删 除虚 函 数 删 除 (VFE) 是 对 未 使 用 节 删 除 的 细 化 , 旨 在 减 少 由 C++ 代 码 生 成 的 映 像中 的 ROM 大 小 。 此 优 化 可 用 于 从 代 码 中 删 除 未 使 用 的 虚 函 数 和 RTTI 对 象 。如 果 函 数 在 各 自 的 节 中 编 译 , 则 VFE 与 未 使 用 节 删 除 同 义 ( 请 参 阅 未 使 用 节 删除 )。 不 过 , 在 输 入 节 包 含 多 个 函 数 的 情 况 下 , 只 有 当 所 有 函 数 都 未 使 用 时 , 才可 以 删 除 输 入 节 。 链 接 器 无 法 从 节 中 删 除 未 使 用 的 函 数 。在 本 节 的 以 下 部 分 中 , 假 设 函 数 在 各 自 的 节 中 编 译 。未 使 用 节 删 除 可 有 效 删 除 C 代 码 中 的 未 使 用 函 数 。 不 过 , 在 C++ 应 用 程 序 中 ,未 使 用 节 和 RTTI 对 象 由 指 针 表 引 用 。 这 意 味 着 链 接 器 使 用 的 删 除 算 法 无 法 保 证可 靠 地 删 除 节 和 RTTI 对 象 。<strong>ARM</strong> 编 译 器 和 链 接 器 利 用 VFE 相 互 协 作 , 编 译 器 提 供 有 关 未 使 用 虚 函 数 的 附 加信 息 , 而 链 接 器 将 使 用 这 些 信 息 。 依 此 分 析 , 链 接 器 能 够 可 靠 地 删 除 未 使 用 的节 。 链 接 器 还 可 通 过 此 协 作 来 删 除 RTTI 对 象 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-11


使 用 基 本 链 接 器 功 能注 意只 要 汇 编 程 序 源 文 件 未 引 用 C++ 库 , 便 无 需 VFE 注 释 。 这 是 因 为 链 接 器 假 设 未引 用 C++ 库 的 目 标 文 件 没 有 进 行 任 何 虚 函 数 调 用 。 类 似 地 , 只 要 使 用 旧 版 本armcc 编 译 的 C 源 文 件 未 引 用 C++ 库 , 便 可 以 参 与 VFE。VFE 有 四 种 运 行 模 式 :OnOffForce使 用 命 令 行 选 项 --vfemode=on 可 启 用 链 接 器 VFE 识 别 。 如 果 您 未 在命 令 行 中 指 定 VFE 选 项 , 则 该 模 式 为 缺 省 模 式 。在 此 模 式 下 , 链 接 器 会 根 据 目 标 文 件 的 内 容 选 择 force 或 off 模 式 :• 如 果 每 个 目 标 文 件 都 包 含 VFE 信 息 或 未 引 用 C++ 库 , 则 链 接器 将 使 用 force 模 式 , 并 继 续 进 行 删 除 。• 如 果 有 任 何 目 标 文 件 缺 少 VFE 信 息 并 引 用 了 C++ 库 , 例 如 使用 以 前 版 本 的 <strong>ARM</strong> 工 具 编 译 的 代 码 , 则 链 接 器 将 使 用 off 模式 , 自 动 禁 用 VFE。 此 时 选 择 off 模 式 以 禁 用 VFE, 可 以 确 保链 接 器 不 会 删 除 不 含 VFE 信 息 的 对 象 使 用 的 虚 函 数 。使 用 命 令 行 选 项 --vfemode=off 可 使 armlink 忽 略 编 译 器 提 供 的 任 何附 加 信 息 。 在 此 模 式 下 , 最 终 映 像 将 与 VFE 不 可 识 别 情 况 下 编 译和 链 接 生 成 的 映 像 相 同 。使 用 命 令 行 选 项 --vfemode=force 可 启 用 链 接 器 VFE 识 别 , 并 强 制 应用 VFE 算 法 。 如 果 某 些 目 标 文 件 不 包 含 VFE 信 息 , 例 如 , 使 用 以前 版 本 的 <strong>ARM</strong> 工 具 编 译 的 文 件 , 链 接 器 会 在 继 续 删 除 的 同 时 显 示一 则 警 告 消 息 , 提 示 您 可 能 发 生 错 误 。Force no RTTI使 用 命 令 行 选 项 --vfemode=force_no_rtti 可 以 启 用 链 接 器 VFE 识别 , 并 强 制 删 除 所 有 RTTI 对 象 。 在 此 模 式 下 , 所 有 虚 函 数 都 将 被保 留 。编 译 器 将 附 加 信 息 放 置 在 名 称 以 .arm_vfe 开 头 的 节 中 。 代 码 的 其 余 部 分 不 会 引用 这 些 节 , 因 此 未 启 用 VFE 识 别 时 链 接 器 会 将 其 忽 略 。 因 此 , 这 些 节 不 会 增 加最 终 映 像 的 大 小 , 而 会 增 加 编 译 器 生 成 的 目 标 文 件 的 大 小 。3-12 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能3.3.5 链 接 器 反 馈armlink 提 供 反 馈 信 息 , 以 便 在 下 次 编 译 文 件 时 提 示 编 译 器 有 关 未 使 用 的 函 数 。这 些 函 数 将 放 置 在 各 自 的 节 中 , 以 便 链 接 器 将 来 删 除 它 们 。当 启 用 --inline 优 化 时 ( 请 参 阅 第 3-20 页 的 跳 转 内 联 ), 链 接 器 内 联 的 函 数 也 发出 到 反 馈 文 件 中 。 这 些 函 数 也 放 置 在 各 自 的 节 中 。--feedback file 选 项 生 成 一 个 反 馈 文 件 , 其 中 以 备 注 形 式 包 含 每 个 输 出 文 件 名 ,并 包 含 在 文 件 中 找 到 的 未 使 用 符 号 , 例 如 :;## <strong>ARM</strong> Linker, RVCT ver [Build num]: Last Updated: Date;VERSION 0.2;FILE foo.ounused_func1


使 用 基 本 链 接 器 功 能}int n = 3;printf("%d cubed = %d\n",n,cubed(n));2. 编 译 器 ( 忽 略 指 示 反 馈 文 件 不 存 在 的 警 告 ):armcc --asm -c --feedback fb.txt fb.c缺 省 情 况 下 , 这 将 内 联 cubed() 函 数 并 创 建 汇 编 程 序 文 件 fb.s 和 目 标 文 件fb.o。 在 汇 编 程 序 文 件 中 ,legacy() 和 cubed() 的 代 码 仍 存 在 。 由 于 此 内 联操 作 ,main 中 没 有 cubed() 的 调 用 。由 于 cubed() 未 声 明 为 static, 因 此 将 保 留 其 外 联 副 本 。3. 使 用 以 下 命 令 行 链 接 目 标 文 件 以 创 建 链 接 器 反 馈 文 件 :armlink --info sizes --list fbout1.txt --feedback fb.txt fb.o -o fb.axf链 接 器 诊 断 将 输 出 到 文 件 fbout1.txt 中 。注 意有 关 详 细 信 息 , 请 参 阅 第 2-26 页 的 生 成 与 映 像 相 关 的 信 息 和 第 2-32 页 的 控制 链 接 器 诊 断 消 息 。链 接 器 反 馈 文 件 在 备 注 中 标 识 包 含 未 使 用 函 数 的 源 文 件 ( 未 被 编 译 器 使用 ), 并 且 包 括 legacy() 和 cubed() 函 数 的 条 目 :;## <strong>ARM</strong> Linker, RVCT ver [Build num]: Last Updated: Date;VERSION 0.2;FILE fb.ocubed


使 用 基 本 链 接 器 功 能注 意要 从 链 接 器 反 馈 获 得 最 大 益 处 , 必 须 执 行 至 少 两 次 完 全 编 译 和 链 接 。 不 过 , 使 用前 一 构 建 反 馈 信 息 执 行 一 次 编 译 和 链 接 通 常 已 足 够 了 。3.3.6 RW 数 据 压 缩RW 数 据 区 通 常 包 含 大 量 的 重 复 值 ( 例 如 0), 使 其 适 合 于 压 缩 。 缺 省 情 况 下 , 将会 启 用 RW 数 据 压 缩 以 便 最 大 程 度 地 减 小 ROM 大 小 。<strong>ARM</strong> 库 包 含 一 些 解 压 缩 算 法 , 链 接 器 会 从 中 选 择 最 佳 的 一 个 添 加 到 映 像 , 在 执行 映 像 时 用 于 解 压 缩 数 据 区 域 。 不 过 , 您 可 以 覆 盖 链 接 器 选 择 的 算 法 。选 择 压 缩 器在 选 择 最 适 当 的 压 缩 算 法 以 生 成 最 小 映 像 之 前 ,armlink 会 收 集 有 关 数 据 节 内 容的 信 息 。 如 果 适 合 于 压 缩 , 链 接 器 将 只 使 用 一 个 数 据 压 缩 器 来 处 理 映 像 中 的 所有 可 压 缩 数 据 节 , 并 对 这 些 节 尝 试 用 不 同 的 压 缩 方 法 以 便 生 成 最 佳 的 整 体 规 模 。如 果 满 足 以 下 条 件 , 可 以 自 动 进 行 压 缩 :Compressed data size + Size of decompressor < Uncompressed data size选 定 压 缩 器 后 ,armlink 会 将 解 压 缩 器 添 加 到 映 像 的 代 码 区 域 。 如 果 最 终 映 像 不包 含 任 何 压 缩 的 数 据 , 则 不 添 加 解 压 缩 器 。您 可 以 通 过 以 下 方 式 覆 盖 链 接 器 使 用 的 压 缩 方 法 :• 使 用 --datacompressor off 选 项 以 关 闭 压 缩 功 能• 指 定 您 选 择 的 压 缩 器 。使 用 命 令 行 选 项 --datacompressor list 获 取 链 接 器 中 可 用 压 缩 器 的 列 表 , 例 如 :Num Compression algorithm========================================================0 Run-length encoding1 Run-length encoding, with LZ77 on small-repeats2 Complex LZ77 compression<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-15


使 用 基 本 链 接 器 功 能如 何 应 用 压 缩 ?行 程 长 度 压 缩 可 将 数 据 编 码 为 非 重 复 字 节 和 重 复 的 零 字 节 。 非 重 复 字 节 按 原 样输 出 , 后 面 跟 随 零 字 节 的 个 数 。 Limpel-Ziv 1977 (LZ77) 压 缩 可 跟 踪 已 看 到 数 据的 最 后 n 个 字 节 , 遇 到 重 复 短 语 时 , 便 会 输 出 一 对 值 , 分 别 对 应 于 该 短 语 先 前 在数 据 缓 冲 区 中 出 现 的 位 置 以 及 短 语 的 长 度 。要 指 定 压 缩 器 , 请 在 链 接 器 命 令 行 上 使 用 所 需 的 ID, 例 如 :armlink --datacompressor 2 ...选 择 压 缩 器 时 , 您 必 须 注 意 :• 压 缩 器 0 适 合 压 缩 包 含 大 量 零 字 节 、 而 非 零 字 节 很 少 的 数 据 。• 压 缩 器 1 适 合 压 缩 有 重 复 的 非 零 字 节 的 数 据 。• 压 缩 器 2 适 合 压 缩 包 含 重 复 值 的 数 据 。链 接 器 会 优 先 选 择 压 缩 器 0 或 1 来 压 缩 包 含 大 量 零 字 节 (>75%) 的 数 据 。 如 果 数据 中 包 含 的 零 字 节 非 常 少 (


使 用 基 本 链 接 器 功 能如 果 您 使 用 分 散 加 载 描 述 文 件 :• 编 码 时 , 名 为 __dc*.o 的 解 压 缩 器 对 象 必 须 在 根 区 中 , 例 如 :LR 0x8000{ER_ROOT +0{__main.o(*)* (Region$$Table)__scatter*.o(*)__dc*.o(*)}}或 者 , 最 好 使 用 InRoot$$Sections 放 置 必 须 位 于 根 区 中 的 所 有 库 节 , 例 如 :LR 0x8000{ER_ROOT +0{* (InRoot$$Sections)}}有 关 详 细 信 息 , 请 参 阅 :— 第 5-41 页 的 为 根 区 分 配 节— 《 开 发 指 南 》 中 的 第 2 章 嵌 入 式 软 件 开 发 。• 通 过 添 加 NOCOMPRESS 属 性 , 指 定 不 能 执 行 压 缩 的 载 入 区 和 执 行 区 。 有 关 详细 信 息 , 请 参 阅 第 5-9 页 的 分 散 加 载 描 述 文 件 的 形 式 语 法 。3.3.7 “PI 到 绝 对 ” 胶 合 代 码正 常 的 调 用 指 令 将 目 标 地 址 编 码 为 调 用 地 址 的 偏 移 量 。 执 行 从 PI 代 码 到 绝 对 代码 的 调 用 时 , 无 法 在 链 接 时 计 算 偏 移 量 , 因 此 链 接 器 必 须 插 入 长 跳 转 胶 合 代 码 。使 用 --piveneer 选 项 可 以 控 制 “PI 到 绝 对 ” 胶 合 代 码 的 生 成 , 缺 省 情 况 下 将 设 置该 选 项 。 使 用 --no_piveneer 关 闭 该 选 项 时 , 如 果 检 测 到 从 PI 代 码 到 绝 对 代 码 的调 用 , 链 接 器 会 生 成 一 个 错 误 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-17


使 用 基 本 链 接 器 功 能3.3.8 胶 合 代 码 生 成胶 合 代 码 是 链 接 器 生 成 的 一 小 段 代 码 并 将 插 入 到 您 的 程 序 中 。 当 跳 转 涉 及 超 过当 前 状 态 的 跳 转 范 围 的 目 标 时 ,armlink 必 须 生 成 胶 合 代 码 。对 于 <strong>ARM</strong>,BL 指 令 的 范 围 为 32MB, 对 于 Thumb-2 为 16MB, 对 于 Thumb 为4MB。 因 此 , 胶 合 代 码 可 以 通 过 变 成 指 令 的 中 间 目 标 来 扩 展 跳 转 范 围 , 然 后 将PC 设 置 为 目 标 地 址 。 如 果 混 合 使 用 <strong>ARM</strong> 和 Thumb, 则 胶 合 代 码 也 会 更 改 处 理器 状 态 。armlink 支 持 以 下 胶 合 代 码 类 型 :• <strong>ARM</strong> 跳 转 到 <strong>ARM</strong>• <strong>ARM</strong> 跳 转 到 Thumb( 交 互 操 作 胶 合 代 码 )• Thumb 跳 转 到 <strong>ARM</strong>( 交 互 操 作 胶 合 代 码 )• Thumb 跳 转 到 Thumb。armlink 为 每 个 胶 合 代 码 创 建 一 个 名 为 Veneer$$Code 的 输 出 节 。 仅 当 其 他 现 有 胶合 代 码 都 不 能 满 足 需 求 时 才 会 生 成 胶 合 代 码 。 如 果 两 个 输 入 节 包 含 目 标 相 同 的长 跳 转 , 则 只 生 成 一 个 胶 合 代 码 。 仅 当 两 个 节 都 可 以 到 达 该 胶 合 代 码 时 才 以 这种 方 式 共 享 胶 合 代 码 。如 果 您 使 用 <strong>ARM</strong>v4T, 则 当 跳 转 涉 及 <strong>ARM</strong> 和 Thumb 之 间 的 状 态 更 改 时 ,armlink会 生 成 胶 合 代 码 。 在 <strong>ARM</strong>v5 及 更 高 版 本 中 , 使 用 BLX 指 令 。胶 合 代 码 共 享您 可 以 使 用 命 令 行 选 项 --no_veneershare 来 指 定 不 共 享 胶 合 代 码 。 这 会 将 已 创 建的 胶 合 代 码 节 的 所 有 权 分 配 给 创 建 该 胶 合 代 码 的 对 象 , 从 而 使 您 能 够 从 分 散 加载 描 述 文 件 中 的 特 定 对 象 选 择 胶 合 代 码 , 例 如 :LR 0x8000{ER_ROOT +0{object1.o(Veneer$$Code)}}使 用 胶 合 代 码 共 享 时 , 不 能 指 定 所 属 对 象 。 因 此 , 使 用 --no_veneershare 选 项 可以 提 供 更 加 一 致 的 映 像 布 局 。 这 是 以 显 著 增 加 代 码 大 小 为 代 价 的 。3-18 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能胶 合 代 码 变 体根 据 您 需 要 的 跳 转 范 围 不 同 , 胶 合 代 码 会 有 不 同 的 变 体 :• 内 联 胶 合 代 码• 短 跳 转 胶 合 代 码• 长 跳 转 胶 合 代 码 。内 联 胶 合 代 码在 此 变 体 中 :• 必 须 正 好 在 目 标 节 的 范 围 之 前 插 入 胶 合 代 码• <strong>ARM</strong>-Thumb 交 互 操 作 的 胶 合 代 码 具 有 256 字 节 的 范 围 , 因 此 函 数 代 码 必须 出 现 在 紧 跟 胶 合 代 码 后 面 的 第 一 个 256 字 节 中• Thumb-<strong>ARM</strong> 交 互 操 作 的 胶 合 代 码 具 有 0 字 节 的 范 围 , 因 此 函 数 代 码 必 须紧 跟 在 胶 合 代 码 后 面• 内 联 胶 合 代 码 始 终 与 位 置 无 关 。这 些 限 制 意 味 着 您 无 法 使 用 Veneer$$Code 将 内 联 胶 合 代 码 移 到 执 行 区 之 外 。 使 用命 令 行 选 项 --no_inlineveneer 可 防 止 生 成 内 联 胶 合 代 码 。短 跳 转 胶 合 代 码在 此 变 体 中 :• <strong>ARM</strong>-Thumb 短 跳 转 胶 合 代 码 具 有 4MB 的 范 围• 短 跳 转 胶 合 代 码 始 终 与 位 置 无 关 。长 跳 转 胶 合 代 码在 此 变 体 中 :• <strong>ARM</strong>-Thumb 和 Thumb-<strong>ARM</strong> 交 互 操 作 胶 合 代 码 均 具 有 2 32 字 节 的 范 围• armlink 将 长 跳 转 功 能 与 状 态 更 改 功 能 相 结 合 , 因 此 所 有 长 跳 转 胶 合 代 码 同时 也 是 交 互 操 作 胶 合 代 码• 长 跳 转 胶 合 代 码 是 绝 对 的 或 与 位 置 无 关 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-19


使 用 基 本 链 接 器 功 能使 用 胶 合 代 码 时 , 请 注 意 以 下 几 点 :• 不 能 将 所 有 胶 合 代 码 集 合 到 一 个 输 入 节 中 , 因 为 生 成 的 胶 合 代 码 输 入 节 可能 不 在 其 他 输 入 节 的 范 围 之 内 。 如 果 节 不 在 寻 址 范 围 内 , 则 不 可 能 使 用 长跳 转 功 能 。• armlink 自 动 生 成 与 位 置 无 关 的 胶 合 代 码 变 体 。 不 过 , 因 为 此 类 胶 合 代 码 大于 非 位 置 无 关 变 体 ,armlink 仅 在 必 要 时 ( 即 当 源 和 目 标 执 行 区 均 与 位 置 无关 或 密 切 相 关 的 情 况 下 ) 才 生 成 此 类 胶 合 代 码 。生 成 胶 合 代 码 是 为 了 优 化 代 码 大 小 。 因 此 ,armlink 按 以 下 优 先 顺 序 选 择 变 体 :1. 内 联 胶 合 代 码 。2. 短 跳 转 胶 合 代 码 。3. 长 胶 合 代 码 。3.3.9 在 重 叠 执 行 区 重 复 使 用 胶 合 代 码只 要 可 能 ,armlink 就 会 重 复 使 用 胶 合 代 码 。 但 是 , 重 复 使 用 时 必 须 强 制 满 足 以下 条 件 :• 重 叠 执 行 区 不 能 重 复 使 用 放 在 任 何 其 他 重 叠 执 行 区 中 的 胶 合 代 码• 其 他 任 何 执 行 区 都 不 能 重 复 使 用 放 在 重 叠 执 行 区 中 的 胶 合 代 码 。如 果 不 满 足 这 些 条 件 , 则 创 建 新 的 胶 合 代 码 , 而 不 重 复 使 用 现 有 胶 合 代 码 。 除 非已 使 用 分 散 加 载 指 示 链 接 器 将 胶 合 代 码 放 在 特 定 的 位 置 , 否 则 , 胶 合 代 码 始 终 放在 包 含 需 要 使 用 该 胶 合 代 码 的 调 用 的 执 行 区 中 。 这 意 味 着 :• 对 于 重 叠 执 行 区 , 它 的 所 有 胶 合 代 码 都 包 含 在 执 行 区 中• 重 叠 执 行 区 从 不 调 用 其 他 执 行 区 中 的 胶 合 代 码 。3.3.10 跳 转 内 联armlink 对 所 有 程 序 代 码 具 有 全 局 可 见 度 , 因 此 可 以 执 行 一 些 附 加 跳 转 优 化 。armlink 使 用 跳 转 内 联 来 优 化 映 像 中 的 小 函 数 调 用 。 小 函 数 定 义 为 可 内 联 到 4 字节 的 BL 或 BLX 指 令 的 任 何 单 指 令 函 数 。 在 这 种 情 况 下 , 不 存 在 跳 转 , 因 此 返 回 地址 是 多 余 的 。注 意缺 省 情 况 下 此 跳 转 优 化 是 关 闭 的 , 因 为 启 用 该 功 能 会 更 改 映 像 , 从 而 可 能 导 致 调试 信 息 不 正 确 。 如 果 启 用 , 则 链 接 器 不 会 尝 试 更 正 调 试 信 息 。3-20 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能使 用 以 下 命 令 行 选 项 控 制 跳 转 内 联 :--no_branchnop链 接 器 将 任 何 跳 转 替 换 为 一 个 重 定 位 , 该 重 定 位 可 解 析 为 具 有 NOP的 下 一 条 指 令 。 这 是 缺 省 行 为 。 但 是 , 在 某 些 情 况 下 可 能 需 要 禁 用该 选 项 , 例 如 , 执 行 验 证 或 管 道 刷 新 时 。使 用 --no_branchnop 选 项 可 禁 用 该 行 为 。--inline 启 用 跳 转 内 联 。 有 关 详 细 信 息 , 请 参 阅 第 3-21 页 的 控 制 内 联 。--tailreorder如 果 可 能 , 将 尾 调 用 节 移 到 紧 靠 其 目 标 的 前 面 , 以 便 优 化 函 数 调用 。 有 关 详 细 信 息 , 请 参 阅 第 3-22 页 的 处 理 尾 调 用 节 。如 果 启 用 跳 转 内 联 ,armlink 将 扫 描 映 像 中 的 每 个 函 数 调 用 , 然 后 在 适 当 位 置 内联 。 在 内 联 函 数 时 ,armlink 会 从 调 用 者 删 除 对 被 调 用 函 数 的 引 用 。 在 删 除 任 何未 使 用 节 之 前 ,armlink 会 应 用 该 优 化 , 这 样 可 以 删 除 任 何 始 终 内 联 的 节 。使 用 --info 命 令 行 选 项 可 显 示 有 关 跳 转 内 联 的 信 息 :--info inline每 次 内 联 函 数 时 显 示 一 条 消 息 并 提 供 内 联 的 总 数 , 例 如 :Small function inlining resultsInlined function __Heap_DescSize from object h1_alloc.o at offset0x5c in section .text from object malloc.o.Inlined function __ieee_status from object istatus.o at offset0x40 in section .text from object _printf_fp_dec.o..Inlined total of 6 calls.控 制 内 联如 果 已 启 用 跳 转 内 联 , 函 数 必 须 满 足 某 些 特 定 条 件 才 能 内 联 :• armlink 只 处 理 最 简 单 的 情 况 , 并 且 不 内 联 读 取 或 写 入 PC 的 任 何 指 令 , 因为 这 取 决 于 函 数 的 位 置 。• 如 果 映 像 同 时 包 含 <strong>ARM</strong> 和 Thumb 代 码 , 则 必 须 构 建 从 其 他 状 态 调 用 的 函数 以 便 进 行 交 互 操 作 。 如 果 等 效 的 <strong>ARM</strong> 指 令 可 用 , 则 <strong>ARM</strong> 调 用 函 数 可 能会 内 联 Thumb 被 调 用 函 数 。 但 是 ,Thumb 调 用 函 数 不 能 内 联 <strong>ARM</strong> 被 调 用函 数 。 同 时 ,armlink 最 多 可 以 内 联 两 个 16 位 Thumb 指 令 。 但 是 ,<strong>ARM</strong> 调用 函 数 只 能 内 联 一 个 16 位 Thumb 指 令 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-21


使 用 基 本 链 接 器 功 能• 链 接 器 的 操 作 还 取 决 于 代 表 函 数 的 符 号 的 大 小 以 及 显 示 在 表 3-2 中 的 调 用函 数 (<strong>ARM</strong> 或 Thumb) 和 被 调 用 函 数 (<strong>ARM</strong> 或 Thumb)。表 3-2 内 联 小 函 数调 用 函 数被 调 用 函数可 以 内 联 的 符 号 大小<strong>ARM</strong> <strong>ARM</strong> 4 到 8 字 节<strong>ARM</strong> Thumb 2 到 6 字 节Thumb Thumb 2 到 6 字 节Thumb <strong>ARM</strong> 4 到 8 字 节• 为 了 执 行 内 联 , 函 数 的 最 后 一 条 指 令 必 须 是 以 下 两 者 之 一 :MOV pc, lr或BX lr只 由 一 个 返 回 序 列 组 成 的 函 数 可 以 作 为 NOP 内 联 。• 只 有 当 BL 的 条 件 与 要 内 联 的 指 令 的 条 件 相 匹 配 , 或 者 BL 或 要 内 联 的 指 令是 无 条 件 指 令 时 , 才 能 内 联 有 条 件 <strong>ARM</strong> 指 令 。 例 如 ,BLEQ 只 能 内 联 类 似 于ADD 的 无 条 件 指 令 或 类 似 于 ADDEQ 的 具 有 匹 配 条 件 的 指 令 。无 条 件 的 <strong>ARM</strong> BL 可 以 内 联 满 足 所 有 其 他 标 准 的 任 何 有 条 件 的 或 无 条 件 的指 令 。• IT 块 的 最 后 一 条 指 令 BL 不 能 内 联 16 位 Thumb 指 令 或 32 位 MRS、MSR 或 CPS指 令 。 这 是 因 为 IT 块 会 更 改 其 作 用 域 内 的 指 令 的 行 为 , 因 此 内 联 指 令 会 更改 程 序 的 行 为 。处 理 尾 调 用 节如 第 3-21 页 的 控 制 内 联 中 所 述 , 链 接 器 会 将 任 何 跳 转 替 换 为 一 个 重 定 位 , 该 重定 位 可 解 析 为 具 有 NOP 的 下 一 条 指 令 。 这 意 味 着 可 以 优 化 尾 调 用 节 ( 即 通 过 跳 转指 令 完 成 的 节 ), 使 其 目 标 紧 跟 在 执 行 区 中 的 尾 调 用 节 后 面 。3-22 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能通 过 使 用 命 令 行 选 项 --tailreorder 将 尾 调 用 节 移 到 其 目 标 上 方 , 可 以 利 用 该 行为 。 如 果 这 是 可 行 的 , 请 注 意 :• armlink 只 能 为 每 个 尾 调 用 目 标 移 动 一 个 尾 调 用 节 。 如 果 存 在 对 单 个 节 的 多个 尾 调 用 , 则 具 有 相 同 节 名 称 的 尾 调 用 节 将 移 到 目 标 前 面 。 如 果 在 具 有 匹配 名 称 的 尾 调 用 节 中 未 找 到 节 名 称 , 则 链 接 器 将 移 动 遇 到 的 第 一 个 节 。• armlink 无 法 将 尾 调 用 节 移 到 执 行 区 之 外 。• armlink 不 会 将 尾 调 用 节 移 到 内 联 胶 合 代 码 前 面 。使 用 --info 命 令 行 选 项 可 显 示 有 关 尾 调 用 优 化 的 信 息 。 例 如 ,--info tailreorder提 供 有 关 任 何 已 移 动 的 尾 调 用 节 的 信 息 :Tailcall reorder resultsTail calling Section !!!main from object __main.o placed before .text from kernel.oTail calling Section .text from object rt_raise.o placed before .text from sys_exit.oTail calling Section .text from object plibspace.o placed before .text from libspace.oTail calling Section .text from object aeabi_idiv0.o placed before .text from rt_div0.o......<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-23


使 用 基 本 链 接 器 功 能3.4 使 用 命 令 行 选 项 创 建 简 单 映 像简 单 映 像 由 多 个 RO、RW 和 ZI 类 型 的 输 入 节 组 成 。 这 些 输 入 节 整 合 成 RO、RW和 ZI 输 出 节 。 根 据 载 入 区 和 执 行 区 中 输 出 节 的 排 列 方 式 , 有 三 种 基 础 类 型 的 简单 映 像 :类 型 1类 型 2类 型 3加 载 视 图 中 有 一 个 区 , 执 行 视 图 中 有 三 个 相 邻 区 。 使 用 --ro-base选 项 可 创 建 此 类 型 的 映 像 。有 关 详 细 信 息 , 请 参 阅 类 型 1, 一 个 加 载 区 和 几 个 连 续 执 行 区 。加 载 视 图 中 有 一 个 区 , 执 行 视 图 中 有 三 个 不 相 邻 的 区 。 使 用--ro-base 和 --rw-base 选 项 可 创 建 此 类 型 的 映 像 。有 关 详 细 信 息 , 请 参 阅 第 3-26 页 的 类 型 2, 一 个 加 载 区 和 几 个 不 连续 的 执 行 区 。加 载 视 图 中 有 两 个 区 , 执 行 视 图 中 有 三 个 不 相 邻 的 区 。 使 用--ro-base、--rw-base 和 --split 选 项 可 创 建 此 类 型 的 映 像 。 您 也 可以 使 用 --rosplit 选 项 将 缺 省 载 入 区 分 为 两 个 RO 输 出 节 , 一 个 用 于代 码 , 另 一 个 用 于 数 据 。有 关 详 细 信 息 , 请 参 阅 第 3-28 页 的 类 型 3, 两 个 加 载 区 和 几 个 不 连续 的 执 行 区 。在 所 有 这 三 种 类 型 的 简 单 映 像 中 , 最 多 允 许 有 三 个 执 行 区 :• 第 一 个 执 行 区 包 含 RO 输 出 节• 第 二 个 执 行 区 包 含 RW 输 出 节 ( 如 果 有 )• 第 三 个 执 行 区 包 含 ZI 输 出 节 ( 如 果 有 )。这 些 执 行 区 称 为 RO、RW 和 ZI 执 行 区 。也 可 以 用 分 散 加 载 描 述 文 件 创 建 简 单 映 像 。 有 关 如 何 执 行 此 操 作 的 详 细 信 息 ,请 参 阅 第 5-46 页 的 简 单 映 像 的 等 效 分 散 加 载 描 述 。3.4.1 类 型 1, 一 个 加 载 区 和 几 个 连 续 执 行 区此 类 型 的 映 像 由 加 载 视 图 中 的 单 个 载 入 区 和 内 存 映 射 中 相 邻 放 置 的 三 个 执 行 区组 成 。 此 方 法 适 用 于 将 程 序 加 载 到 RAM 中 的 系 统 , 例 如 OS 引 导 加 载 程 序 或 桌面 系 统 ( 请 参 阅 第 3-25 页 的 图 3-3)。3-24 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能RAMZI output sectionZI executionregion--ro-base valueRW output sectionRO output sectionSingleloadregion0x8000RW output sectionRO output sectionRW executionregionRO executionregion0x0000Load viewExecution view图 3-3 简 单 类 型 1 映 像使 用 以 下 命 令 创 建 此 类 映 像 :armlink --ro-base 0x8000加 载 视 图单 个 载 入 区 由 连 续 放 置 的 RO 和 RW 输 出 节 组 成 。 RO 和 RW 执 行 区 都 是 根 区 。加 载 时 不 存 在 ZI 输 出 节 。 该 节 是 在 执 行 前 使 用 映 像 文 件 中 的 输 出 节 描 述 创 建的 。执 行 视 图包 含 RO、RW 和 ZI 输 出 节 的 三 个 执 行 区 相 邻 排 列 。 RO 和 RW 执 行 区 的 执 行 地址 与 其 加 载 地 址 相 同 , 因 此 不 需 要 从 加 载 地 址 向 执 行 地 址 移 动 任 何 内 容 。 不 过 ,包 含 ZI 输 出 节 的 ZI 执 行 区 是 在 执 行 开 始 前 创 建 的 。使 用 armlink 选 项 --ro-base address 可 指 定 包 含 RO 输 出 的 区 的 加 载 地 址 和 执 行地 址 。 缺 省 地 址 是 0x8000, 如 图 3-3 中 所 示 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-25


使 用 基 本 链 接 器 功 能3.4.2 类 型 2, 一 个 加 载 区 和 几 个 不 连 续 的 执 行 区此 类 型 的 映 像 由 单 个 载 入 区 和 执 行 视 图 中 的 三 个 执 行 区 组 成 。 RW 执 行 区 与 RO执 行 区 是 不 相 邻 的 。 例 如 , 此 方 法 适 用 于 基 于 ROM 的 嵌 入 式 系 统 ( 请 参 阅 图3-4), 其 中 RW 数 据 在 启 动 时 从 ROM 复 制 到 RAM。RAM0xA000ZI output sectionRW output sectionZI executionregionRW executionregion--rw-base valueCopy ordecompressROMRW output sectionRO output sectionLoad viewSingleloadregion0x0000RO output sectionExecution viewRO executionregion--ro-base value图 3-4 简 单 类 型 2 映 像使 用 以 下 命 令 创 建 此 类 映 像 :armlink --ro-base 0x0 --rw-base 0xA000加 载 视 图在 加 载 视 图 中 , 单 载 入 区 由 连 续 放 置 的 RO 和 RW 输 出 节 ( 例 如 在 ROM 中 ) 组成 。 此 处 的 RO 区 是 根 区 ,RW 区 是 非 根 区 。 加 载 时 不 存 在 ZI 输 出 节 。 该 节 在 运行 时 创 建 。执 行 视 图在 执 行 视 图 中 , 第 一 个 执 行 区 包 含 RO 输 出 节 , 第 二 个 执 行 区 包 含 RW 和 ZI 输 出节 。包 含 RO 输 出 节 的 区 的 执 行 地 址 与 加 载 地 址 相 同 , 因 此 不 必 移 动 RO 输 出 节 。即 , 它 是 根 区 。3-26 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能包 含 RW 输 出 节 的 区 的 执 行 地 址 与 加 载 地 址 不 同 , 因 此 RW 输 出 节 从 ( 单 载 入区 ) 加 载 地 址 移 到 其 执 行 地 址 ( 第 二 个 执 行 区 中 )。 ZI 执 行 区 及 其 输 出 节 与 RW执 行 区 相 邻 放 置 。使 用 armlink 选 项 --ro-base address 可 指 定 RO 输 出 节 的 加 载 地 址 和 执 行 地 址 , 使用 --rw-base exec_address 可 指 定 RW 输 出 节 的 执 行 地 址 。 如 果 未 使 用 --ro-base选 项 指 定 地 址 , 则 armlink 将 使 用 缺 省 值 0x8000。 对 于 嵌 入 式 系 统 ,--ro-base 值通 常 为 0x0。 如 果 未 使 用 --rw-base 选 项 指 定 地 址 , 则 缺 省 情 况 下 将 RW 放 在 紧 靠RO 的 上 方 。( 如 第 3-24 页 的 类 型 1, 一 个 加 载 区 和 几 个 连 续 执 行 区 中 所 述 )。注 意RW 和 ZI 输 出 节 的 执 行 区 不 能 与 任 何 载 入 区 重 叠 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-27


使 用 基 本 链 接 器 功 能3.4.3 类 型 3, 两 个 加 载 区 和 几 个 不 连 续 的 执 行 区此 类 型 的 映 像 与 类 型 2 的 映 像 相 似 , 只 是 单 个 载 入 区 现 在 分 成 两 个 载 入 区 。( 请参 阅 图 3-5)。--rw-base valueRAMRW output sectionSecondloadregion0xE000ZI output sectionRW output sectionZI executionregionRW executionregion--ro-base valueRO output sectionFirstloadregion0x80000x0000RO output sectionRO executionregionLoad viewExecution view图 3-5 简 单 类 型 3 映 像使 用 以 下 命 令 创 建 此 类 映 像 :armlink --split --ro-base 0x8000 --rw-base 0xE000加 载 视 图在 加 载 视 图 中 , 第 一 个 载 入 区 由 RO 输 出 节 组 成 , 第 二 个 载 入 区 由 RW 输 出 区 组成 。 加 载 时 不 存 在 ZI 输 出 节 。 它 是 在 执 行 前 , 使 用 映 像 文 件 中 包 含 的 输 出 节 描述 创 建 的 。执 行 视 图在 执 行 视 图 中 , 第 一 个 执 行 区 包 含 RO 输 出 节 , 第 二 个 执 行 区 包 含 RW 和 ZI 输 出节 。RO 区 的 执 行 地 址 与 其 加 载 地 址 相 同 , 因 此 RO 输 出 节 的 内 容 不 必 从 加 载 地 址 移动 或 复 制 到 执 行 地 址 。 RO 和 RW 都 是 根 区 。3-28 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能RW 区 的 执 行 地 址 也 与 其 加 载 地 址 相 同 , 因 此 RW 输 出 节 的 内 容 不 必 从 加 载 地 址移 到 执 行 地 址 。 不 过 ,ZI 输 出 节 是 在 执 行 开 始 之 前 创 建 的 , 并 且 放 在 RW 区 之后 。使 用 以 下 链 接 器 选 项 指 定 加 载 地 址 和 执 行 地 址 :--split将 缺 省 的 单 载 入 区 ( 包 含 RO 和 RW 输 出 节 ) 分 成 两 个 载 入 区 ( 一 个包 含 RO 输 出 节 , 另 一 个 包 含 RW 输 出 节 ), 因 此 可 以 使 用--ro-base 和 --rw-base 分 别 放 置 这 两 个 载 入 区 。--ro-base address--rw-base address指 示 armlink 将 包 含 RO 节 的 区 的 加 载 地 址 和 执 行 地 址 设 置 在 4 字节 对 齐 的 address 处 ( 例 如 ,ROM 中 第 一 个 位 置 的 地 址 )。 如 果 未使 用 --ro-base 选 项 指 定 地 址 , 则 armlink 将 使 用 缺 省 值 0x8000。指 示 armlink 将 包 含 RW 输 出 节 的 执 行 地 址 设 置 在 4 字 节 对 齐 的address 处 。 如 果 此 选 项 与 --split 结 合 使 用 , 则 同 时 指 定 RW 区 的加 载 地 址 和 执 行 地 址 , 例 如 它 是 根 区 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-29


使 用 基 本 链 接 器 功 能3.5 使 用 命 令 行 选 项 处 理 C++ 异 常缺 省 情 况 下 , 或 如 果 指 定 选 项 --exceptions, 则 映 像 可 以 包 含 异 常 表 。 如 果 无 代码 抛 出 异 常 , 则 自 动 丢 弃 异 常 表 。 但 是 , 如 果 已 指 定 选 项 --no_exceptions, 并 且在 删 除 未 使 用 节 之 后 出 现 任 何 异 常 节 , 则 链 接 器 会 生 成 一 则 错 误 消 息 。如 果 需 要 确 保 您 的 代 码 不 出 现 异 常 , 请 使 用 --no_exceptions 选 项 。 链 接 器 将 生 成一 则 错 误 消 息 以 突 出 显 示 已 找 到 的 异 常 , 并 且 不 生 成 最 终 映 像 。不 过 , 您 可 以 将 --no_exceptions 选 项 和 --diag_warning 选 项 结 合 使 用 , 将 错 误 消息 降 级 为 警 告 。 链 接 器 会 生 成 最 终 映 像 , 但 也 会 生 成 一 则 消 息 , 警 告 您 发 现 了 异常 。链 接 器 可 以 为 包 含 调 试 帧 信 息 的 传 统 对 象 创 建 异 常 表 。 链 接 器 可 以 为 C 和 汇 编语 言 对 象 安 全 地 进 行 此 操 作 。 缺 省 情 况 下 , 链 接 器 不 创 建 异 常 表 。 这 与 使 用 链接 器 选 项 --exceptions_tables=nocreate 的 结 果 相 同 。使 用 链 接 器 选 项 --exceptions_tables=unwind, 链 接 器 可 以 通 过 .debug_frame 信 息为 不 带 异 常 表 的 映 像 中 的 每 个 节 创 建 一 个 寄 存 器 恢 复 展 开 表 。 如 果 无 法 创 建 ,链 接 器 将 改 为 创 建 非 展 开 表 。使 用 链 接 器 选 项 --exceptions_tables=cantunwind 可 为 不 带 异 常 表 的 映 像 中 的 每 个节 创 建 一 个 非 展 开 表 。注 意有 以 下 几 点 需 要 注 意 :• 使 用 缺 省 设 置 ( 即 --exceptions --exception_tables=nocreate) 时 , 通 过 C 代码 或 汇 编 代 码 抛 出 异 常 是 不 安 全 的 ( 除 非 使 用 --exceptions 选 项 编 译 C 代码 )。• 针 对 不 带 异 常 支 持 的 已 编 译 C++ 代 码 ( 例 如 , 使 用 RVCT v1.2 编 译 的 任 何代 码 , 或 在 RVCT 3.0 中 使 用 --no_exceptions 选 项 编 译 的 代 码 ), 链 接 器 不能 生 成 清 除 其 中 的 自 动 变 量 的 代 码 。3-30 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能3.6 获 得 有 关 映 像 的 信 息您 可 以 使 用 --info 选 项 来 获 得 有 关 链 接 器 如 何 生 成 映 像 的 信 息 , 例 如 :armlink --info sizes ...此 处 sizes 提 供 映 像 中 每 个 输 入 对 象 和 库 成 员 的 代 码 和 数 据 大 小 的 列 表 。 使 用 此选 项 相 当 于 --info sizes,totals。有 关 可 以 为 --info 命 令 行 选 项 指 定 的 主 题 关 键 字 的 详 细 信 息 , 请 参 阅 第 2-26 页的 生 成 与 映 像 相 关 的 信 息 。示 例 3-2 显 示 了 表 格 形 式 的 输 出 , 其 中 各 个 总 和 相 互 分 开 以 方 便 阅 读 。示 例 3-2 映 像 信 息Code (inc. data) RO Data RW Data ZI Data Debug3712 1580 19 44 10200 7436 Object Totals0 0 16 0 0 0 (incl. Generated)0 0 3 0 0 0 (incl. Padding)21376 648 805 4 300 10216 Library Totals0 0 6 0 0 0 (incl. Padding)===============================================================================Code (inc. data) RO Data RW Data ZI Data Debug25088 2228 824 48 10500 17652 Grand Totals25088 2228 824 48 10500 17652 ELF Image Totals25088 2228 824 48 0 0 ROM Totals===============================================================================Total RO Size (Code + RO Data)Total RW Size (RW Data + ZI Data)Total ROM Size (Code + RO Data + RW Data)25912 ( 25.30kB)10548 ( 10.30kB)25960 ( 25.35kB)Code (inc. Data)显 示 代 码 占 用 了 多 少 字 节 。 在 此 映 像 中 , 有 3712 字 节 的 代 码 。 这包 括 1580 字 节 的 内 联 数 据 (inc. Data), 例 如 , 文 字 池 和 短 字 符 串 。RO Data显 示 只 读 数 据 占 用 了 多 少 字 节 。 这 是 除 Code (inc. Data) 列 中 包 括的 内 联 数 据 之 外 的 数 据 。RW Data 显 示 读 写 数 据 占 用 了 多 少 字 节 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-31


使 用 基 本 链 接 器 功 能ZI Data 显 示 零 初 始 化 的 数 据 占 用 了 多 少 字 节 。Debug显 示 调 试 数 据 占 用 了 多 少 字 节 , 例 如 , 调 试 输 入 节 以 及 符 号 和 字 符串 表 。Object Totals显 示 链 接 到 一 起 以 生 成 映 像 的 对 象 占 用 了 多 少 字 节 。(incl. Generated)armlink 会 生 成 映 像 内 容 , 例 如 , 交 互 操 作 胶 合 代 码 和 输 入 节 ( 如 区表 )。 如 果 Object Totals 行 包 含 此 类 型 的 数 据 , 则 会 显 示 在 该 行中 。 在 第 3-31 页 的 示 例 3-2 中 , 共 有 19 字 节 的 RO 数 据 , 其 中 16 字节 是 链 接 器 生 成 的 RO 数 据 。Library Totals显 示 已 提 取 并 作 为 单 个 对 象 添 加 到 映 像 中 的 库 成 员 占 用 了 多 少 字节 。(incl. Padding)armlink 将 根 据 需 要 插 入 填 充 , 以 强 制 节 对 齐 ( 请 参 阅 第 3-9 页 的 对齐 节 )。 如 果 Object Totals 行 包 括 此 类 型 的 数 据 , 则 会 显 示 在 相 关联 的 (incl. Padding) 行 中 。 类 似 地 , 如 果 Library Totals 行 包 括 此 类型 的 数 据 , 则 会 显 示 在 相 关 联 的 行 中 。 在 第 3-31 页 的 示 例 3-2 中 ,对 象 总 计 中 有 19 字 节 的 RO 数 据 , 其 中 3 字 节 是 链 接 器 生 成 的 填 充; 而 库 总 计 中 有 805 字 节 的 RO 数 据 , 其 中 带 有 6 字 节 的 填 充 。Grand Totals显 示 映 像 的 真 实 大 小 。 在 第 3-31 页 的 示 例 3-2 中 , 有 10200 字 节 的ZI 数 据 ( 在 Object Totals 中 ) 和 300 字 节 的 ZI 数 据 ( 在 LibraryTotals) 中 ), 总 共 为 10500 字 节 。ELF Image Totals如 果 您 使 用 RW 数 据 压 缩 ( 缺 省 值 ) 优 化 ROM 大 小 , 则 最 终 映 像 的大 小 会 更 改 , 并 且 这 会 在 --info 生 成 的 输 出 中 反 映 出 来 。 比 较Grand Totals 和 ELF Image Totals 下 的 字 节 数 , 查 看 压 缩 效 果 。在 第 3-31 页 的 示 例 3-2 中 , 未 启 用 RW 数 据 压 缩 。 如 果 对 数 据 进 行压 缩 , 则 RW 值 会 更 改 。 有 关 详 细 信 息 , 请 参 阅 第 3-15 页 的 RW 数据 压 缩 。3-32 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 基 本 链 接 器 功 能ROM Totals显 示 包 含 映 像 所 需 的 ROM 的 最 小 大 小 。 这 不 包 括 ZI 数 据 和 存 储 在ROM 中 的 调 试 信 息 。3.6.1 使 用 与 映 像 相 关 的 信 息您 可 以 使 用 --map 选 项 创 建 映 像 映 射 。 这 包 括 每 个 载 入 区 、 执 行 区 和 映 像 中 的 输入 节 的 地 址 和 大 小 , 并 显 示 应 用 RW 数 据 压 缩 的 方 式 。 有 关 详 细 信 息 , 请 参 阅第 2-26 页 的 生 成 与 映 像 相 关 的 信 息 。您 可 以 使 用 --info inputs 标 识 某 些 链 接 错 误 的 起 源 。 例 如 , 您 可 以 搜 索 输 出 , 以便 查 找 库 对 象 中 未 定 义 的 引 用 , 或 者 查 找 由 于 重 定 向 某 些 库 函 数 而 不 重 定 向 其他 函 数 而 导 致 的 多 重 定 义 的 符 号 。 从 该 输 出 的 结 尾 开 始 反 向 搜 索 , 查 找 并 解 决链 接 错 误 。 还 可 以 使 用 --verbose 选 项 输 出 带 有 链 接 器 操 作 的 附 加 信 息 的 类 似 文本 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 3-33


使 用 基 本 链 接 器 功 能3-34 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


第 4 章访 问 映 像 符 号本 章 介 绍 了 如 何 使 用 <strong>ARM</strong> 链 接 器 armlink 来 引 用 符 号 。 它 包 含 以 下 几 节 :• 第 4-2 页 的 <strong>ARM</strong>/Thumb 同 义 词• 第 4-3 页 的 访 问 链 接 器 定 义 的 符 号• 第 4-8 页 的 访 问 其 他 映 像 中 的 符 号• 第 4-11 页 的 隐 藏 和 重 命 名 全 局 符 号• 第 4-21 页 的 使 用 $Super$$ 和 $Sub$$ 覆 盖 符 号 定 义• 第 4-22 页 的 符 号 版 本 控 制<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-1


访 问 映 像 符 号4.1 <strong>ARM</strong>/Thumb 同 义 词链 接 器 允 许 符 号 的 多 个 定 义 在 映 像 中 共 存 , 但 前 提 是 每 个 定 义 与 不 同 处 理 器 状态 相 关 联 。 当 使 用 <strong>ARM</strong>/Thumb 同 义 词 引 用 符 号 时 ,armlink 将 应 用 以 下 规 则 :• 针 对 处 于 <strong>ARM</strong> 状 态 的 符 号 执 行 的 B、BL 或 BLX 指 令 将 解 析 为 <strong>ARM</strong> 定 义 。• 针 对 处 于 Thumb 状 态 的 符 号 执 行 的 B、BL 或 BLX 指 令 将 解 析 为 Thumb 定义 。任 何 其 他 符 号 引 用 将 解 析 为 链 接 器 遇 到 的 第 一 个 定 义 。 在 这 种 情 况 下 ,armlink将 显 示 警 告 , 说 明 指 定 了 所 选 的 符 号 。4-2 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号4.2 访 问 链 接 器 定 义 的 符 号链 接 器 定 义 了 一 些 包 含 $$ 字 符 序 列 的 符 号 。 这 些 符 号 和 所 有 其 他 包 含 $$ 序 列 的外 部 名 称 都 是 <strong>ARM</strong> 的 保 留 名 称 。汇 编 语 言 程 序 可 以 导 入 这 些 符 号 地 址 并 将 其 用 作 可 重 定 位 的 地 址 , 或 者 从 C 或C++ 源 代 码 中 将 其 作 为 extern 符 号 进 行 引 用 。 有 关 详 细 信 息 , 请 参 阅 第 4-7 页 的导 入 链 接 器 定 义 的 符 号 。注 意仅 当 代 码 引 用 链 接 器 定 义 的 符 号 时 , 才 会 生 成 这 些 符 号 。4.2.1 与 区 相 关 的 符 号与 区 相 关 的 符 号 是 在 链 接 器 创 建 映 像 时 生 成 的 。 表 4-1 显 示 了 链 接 器 为 映 像 中 存在 的 每 个 执 行 区 生 成 的 符 号 。表 4-1 与 区 相 关 的 链 接 器 符 号符 号Load$$region_name$$BaseImage$$region_name$$BaseImage$$region_name$$LengthImage$$region_name$$LimitImage$$region_name$$RO$$Base说 明区 的 加 载 地 址区 的 执 行 地 址执 行 区 字 节 长 度 (4 的 倍 数 ), 不 包 括 ZI 长 度执 行 区 中 非 ZI 部 分 末 尾 后 面 的 字 节 的 地 址此 区 中 的 RO 输 出 节 的 执 行 地 址Image$$region_name$$RO$$Length RO 输 出 节 的 字 节 长 度 (4 的 倍 数 )Image$$region_name$$RO$$LimitImage$$region_name$$RW$$Base执 行 区 中 RO 输 出 节 末 尾 后 面 的 字 节 的 地 址此 区 中 的 RW 输 出 节 的 执 行 地 址Image$$region_name$$RW$$Length RW 输 出 节 的 字 节 长 度 (4 的 倍 数 )Image$$region_name$$RW$$LimitImage$$region_name$$ZI$$Base执 行 区 中 RW 输 出 节 末 尾 后 面 的 字 节 的 地 址此 区 中 的 ZI 输 出 节 的 执 行 地 址Image$$region_name$$ZI$$Length ZI 输 出 节 的 字 节 长 度 (4 的 倍 数 )Image$$region_name$$ZI$$Limit执 行 区 中 ZI 输 出 节 末 尾 后 面 的 字 节 的 地 址<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-3


访 问 映 像 符 号如 果 未 使 用 分 散 加 载 , 链 接 器 将 使 用 以 下 内 容 的 region_name 值 :• ER_RO, 适 用 于 只 读 执 行 区• ER_RW, 适 用 于 读 写 执 行 区• ER_ZI, 适 用 于 零 初 始 化 的 执 行 区 。注 意• 映 像 的 ZI 输 出 节 不 是 静 态 创 建 的 , 而 是 在 运 行 时 自 动 动 态 创 建 的 。 因 此 ,ZI 输 出 节 没 有 加 载 地 址 符 号 。• 建 议 优 先 使 用 与 区 相 关 的 符 号 , 而 不 是 与 节 相 关 的 符 号 。使 用 分 散 加 载 描 述 文 件如 果 使 用 分 散 加 载 , 描 述 文 件 将 命 名 映 像 中 的 所 有 执 行 区 , 并 提 供 其 加 载 和 执 行地 址 。如 果 描 述 文 件 定 义 了 堆 栈 和 堆 , 链 接 器 还 会 生 成 特 殊 堆 栈 和 堆 符 号 。有 关 详 细 信 息 , 请 参 阅 第 5 章 使 用 分 散 加 载 描 述 文 件 。将 堆 栈 和 堆 放 在 ZI 区 上 面与 区 相 关 的 符 号 的 一 个 常 见 用 途 是 , 将 堆 直 接 放 在 ZI 区 上 面 。 第 4-4 页 的 示例 4-1 说 明 了 如 何 使 用 汇 编 语 言 创 建 改 变 目 标 的 __user_initial_stackheap() 版本 。 该 示 例 假 设 使 用 <strong>ARM</strong> C 库 中 的 缺 省 单 区 内 存 模 型 。 有 关 详 细 信 息 , 请 参 阅《 库 和 浮 点 支 持 指 南 》 中 的 第 2-83 页 的 __user_initial_stackheap()。 有 关 如 何 使 用C 实 现 此 操 作 的 示 例 , 另 请 参 阅 《 开 发 指 南 》 中 的 第 6 章 处 理 处 理 器 异 常 。示 例 4-1 将 堆 栈 和 堆 放 在 ZI 区 上 面EXPORT __user_initial_stackheapIMPORT ||Image$$region_name$$ZI$$Limit||__user_initial_stackheapLDR r0, =||Image$$region_name$$ZI$$Limit||MOV pc, lr4-4 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号4.2.2 与 节 相 关 的 符 号如 果 使 用 命 令 行 选 项 创 建 简 单 映 像 , 则 会 生 成 表 4-2 中 所 示 的 输 出 节 符 号 。 简 单映 像 有 三 个 输 出 节 (RO、RW 和 ZI), 它 们 生 成 三 个 执 行 区 。 对 于 映 像 中 存 在 的每 个 输 入 节 , 链 接 器 将 生 成 第 4-6 页 的 表 4-3 中 所 示 的 输 入 符 号 。链 接 器 先 按 RO、RW 或 ZI 属 性 对 执 行 区 内 的 节 进 行 排 序 , 然 后 按 名 称 进 行 排序 。 例 如 , 将 所 有 .text 节 放 在 一 个 连 续 块 中 。 包 含 相 同 属 性 和 名 称 的 节 的 连 续块 称 为 合 并 节 。输 出 节 符 号如 果 使 用 分 散 加 载 描 述 文 件 , 则 不 会 定 义 表 4-2 中 的 输 出 节 符 号 。 如 果 代 码 访 问这 些 符 号 , 则 必 须 将 其 视 为 弱 引 用 。__user_initial_stackheap() 的 标 准 实 现 使 用 Image$$ZI$$Limit 中 的 值 。 因 此 , 如 果使 用 分 散 加 载 描 述 文 件 , 则 可 能 需 要 重 新 实 现 __user_initial_stackheap() 以 设 置堆 和 堆 栈 边 界 。 有 关 详 细 信 息 , 请 参 阅 第 5 章 使 用 分 散 加 载 描 述 文 件 。符 号 节 类 型 说 明Image$$RO$$Base 输 出 RO 输 出 节 的 起 始 地 址 。表 4-2 与 映 像 相 关 的 符 号Image$$RO$$Limit 输 出 RO 输 出 节 末 尾 后 面 的 第 一 个 字 节 的 地 址 。Image$$RW$$Base 输 出 RW 输 出 节 的 开 始 地 址 。Image$$RW$$Limit 输 出 ZI 输 出 节 末 尾 后 面 的 字 节 的 地 址 。( 选 择 ZI区 末 尾 而 不 是 RW 区 末 尾 是 为 了 与 遗 留 代 码之 间 保 持 兼 容 。)Image$$ZI$$Base 输 出 ZI 输 出 节 的 开 始 地 址 。Image$$ZI$$Limit 输 出 ZI 输 出 节 末 尾 后 面 的 字 节 的 地 址 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-5


访 问 映 像 符 号输 入 节 符 号如 果 代 码 引 用 输 入 节 符 号 , 则 假 设 您 希 望 将 映 像 中 所 有 具 有 相 同 名 称 的 输 入 节连 续 放 在 映 像 内 存 映 射 中 。 如 果 分 散 加 载 描 述 不 连 续 地 放 置 这 些 输 入 节 , 链 接器 将 诊 断 出 错 , 因 为 在 不 连 续 的 内 存 上 使 用 base 和 limit 符 号 通 常 会 产 生 不 可 预见 和 不 希 望 出 现 的 结 果 。符 号 节 类 型 说 明表 4-3 与 节 相 关 的 符 号SectionName$$Base 输 入 名 为 SectionName 的 合 并 节 的 开 始 地 址 。SectionName$$Length 输 入 名 为 SectionName 的 合 并 节 的 长 度 ( 以 字 节 为单 位 )。SectionName$$Limit 输 入 名 为 SectionName 的 合 并 节 末 尾 后 面 的 字 节 的地 址 。4-6 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号4.2.3 导 入 链 接 器 定 义 的 符 号可 以 使 用 两 种 方 法 , 将 链 接 器 定 义 的 符 号 导 入 到 C 或 C++ 源 代 码 中 。 请 使 用 以下 方 法 之 一 :extern unsigned int symbol_name;或extern void *symbol_name;如 果 将 符 号 声 明 为 int, 则 必 须 使 用 取 址 运 算 符 获 取 正 确 的 值 , 如 示 例 4-2 中 所示 。示 例 4-2 导 入 链 接 器 定 义 的 符 号extern unsigned int Image$$ZI$$Limitconfig.heap_base = (unsigned int) &Image$$ZI$$Limit<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-7


访 问 映 像 符 号4.3 访 问 其 他 映 像 中 的 符 号如 果 要 使 一 个 映 像 能 够 识 别 另 一 个 映 像 的 全 局 符 号 值 , 可 以 使 用 符 号 定 义(symdefs) 文 件 。例 如 , 如 果 一 个 映 像 始 终 位 于 ROM 中 并 且 将 多 个 映 像 加 载 到 RAM 中 , 则 可 以使 用 这 种 方 法 。 加 载 到 RAM 中 的 映 像 可 以 访 问 位 于 ROM 中 的 映 像 的 全 局 函 数和 数 据 。4.3.1 创 建 symdefs 文 件可 以 使 用 armlink 选 项 --symdefs filename 生 成 symdefs 文 件 。链 接 器 将 在 成 功 完 成 的 最 后 链 接 阶 段 生 成 symdefs 文 件 。 部 分 链 接 或 最 后 失 败的 链 接 不 会 生 成 此 文 件 。注 意如 果 filename 不 存 在 , 创 建 的 文 件 将 包 含 所 有 全 局 符 号 。 如 果 filename 存 在 , 则使 用 filename 的 现 有 内 容 来 选 择 链 接 器 重 写 文 件 时 输 出 的 符 号 。 如 果 不 希 望 出现 此 行 为 , 请 确 保 在 链 接 步 骤 之 前 删 除 任 何 现 有 的 symdefs 文 件 。输 出 全 局 符 号 的 子 集缺 省 情 况 下 , 所 有 全 局 符 号 都 写 入 到 symdefs 文 件 中 。如 果 filename 存 在 , 链 接 器 将 使 用 其 内 容 将 输 出 限 制 为 全 局 符 号 的 一 个 子 集 。 要限 制 输 出 符 号 , 请 执 行 以 下 操 作 :1. 在 执 行 image1 将 近 最 后 的 链 接 时 , 指 定 --symdefs filename。 链 接 器 将 创 建symdefs 文 件 filename。2. 在 文 本 编 辑 器 中 打 开 filename, 删 除 不 希 望 出 现 在 最 终 列 表 中 的 所 有 符 号条 目 , 然 后 保 存 文 件 。3. 在 执 行 image1 的 最 后 链 接 时 , 指 定 --symdefs filename。可 以 随 时 编 辑 filename 以 添 加 注 释 , 然 后 重 新 链 接 image1, 例 如 , 在 用 于 创建 image1 的 一 个 或 多 个 对 象 发 生 变 化 后 更 新 符 号 定 义 。4-8 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号4.3.2 读 取 symdefs 文 件可 以 将 symdefs 文 件 视 为 一 个 目 标 文 件 , 其 中 包 含 符 号 信 息 , 但 不 包 含 代 码 或 数据 。 就 像 任 何 目 标 文 件 一 样 , 要 读 取 symdefs 文 件 , 请 将 其 添 加 到 文 件 列 表 中 。链 接 器 将 读 取 该 文 件 , 并 将 符 号 及 其 值 添 加 到 输 出 符 号 表 中 。 添 加 的 符 号 具 有ABSOLUTE 和 GLOBAL 属 性 。如 果 执 行 部 分 链 接 , 则 会 将 符 号 添 加 到 输 出 对 象 符 号 表 中 。 如 果 执 行 完 整 链 接 ,则 会 将 符 号 添 加 到 映 像 符 号 表 中 。对 于 文 件 中 的 无 效 行 , 链 接 器 将 生 成 错 误 消 息 。 无 效 行 是 指 :• 缺 少 任 何 列 的 行 ;• 任 何 列 具 有 无 效 值 的 行 。从 symdefs 文 件 中 提 取 的 符 号 的 处 理 方 式 与 从 对 象 符 号 表 中 提 取 的 符 号 完 全 相同 。 有 关 多 个 符 号 定 义 和 <strong>ARM</strong>/Thumb 同 义 词 的 限 制 同 样 适 用 。4.3.3 symdefs 文 件 格 式symdefs 文 件 包 含 符 号 及 其 值 。 但 是 , 与 其 他 目 标 文 件 不 同 , 它 不 包 含 任 何 代 码或 数 据 。该 文 件 由 标 识 行 、 可 选 注 释 和 符 号 信 息 组 成 , 如 示 例 4-3 中 所 示 。示 例 4-3 symdefs 文 件 格 式## <strong>ARM</strong> Linker, RVCT3.1 [Build num]: Last Updated: Date;value type name, this is an added comment0x00008000 A __main0x00008004 A __scatterload0x000080e0 T main0x0000814d T _main_arg0x0000814d T __argv_alloc0x00008199 T __rt_get_argv...# This is also a comment, blank lines are ignored...0x0000a4fc D __stdin0x0000a540 D __stdout0x0000a584 D __stderr0xfffffffd N __SIG_IGN<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-9


访 问 映 像 符 号标 识 字 符 串如 果 文 本 文 件 的 前 11 个 字 符 是 ##, 则 链 接 器 将 该 文 件 识 别 为 symdefs文 件 。标 识 字 符 串 后 面 是 链 接 器 版 本 信 息 以 及 最 近 更 新 symdefs 文 件 的 日 期 和 时 间 。版 本 和 更 新 信 息 不 是 标 识 字 符 串 的 一 部 分 。注 释可 以 使 用 文 本 编 辑 器 手 动 插 入 注 释 。 注 释 具 有 以 下 属 性 :• 第 一 行 的 开 头 必 须 为 特 殊 标 识 注 释 ##。 此 注 释 是 链 接 器 在 生 成 该文 件 时 插 入 的 , 不 能 手 动 将 其 删 除 。• 如 果 任 何 行 的 第 一 个 非 空 白 字 符 是 分 号 (;) 或 井 号 (#), 则 该 行 为 注 释 。• 第 一 个 非 空 白 字 符 后 面 的 分 号 (;) 或 井 字 (#) 不 作 为 注 释 开 始 字 符 。• 可 以 忽 略 和 插 入 空 行 以 提 高 可 读 性 。符 号 信 息符 号 信 息 是 通 过 放 在 一 行 中 的 符 号 地 址 、 类 型 和 名 称 提 供 的 :符 号 值 链 接 器 以 固 定 十 六 进 制 格 式 写 入 符 号 的 绝 对 地 址 , 例 如 ,0x00008000。 如 果 编 辑 该 文 件 , 您 可 以 使 用 十 六 进 制 或 十 进 制格 式 的 地 址 值 。类 型 标 记 用 于 说 明 符 号 类 型 的 单 个 字 母 :A <strong>ARM</strong> 代 码T Thumb 代 码D 数 据N 数 字 。符 号 名 符 号 名 称 。4-10 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号4.4 隐 藏 和 重 命 名 全 局 符 号本 节 介 绍 了 如 何 使 用 控 制 文 件 来 管 理 输 出 文 件 中 的 符 号 名 称 。 例 如 , 可 以 使 用控 制 文 件 保 护 知 识 产 权 , 或 者 避 免 发 生 命 名 空 间 冲 突 。 控 制 文 件 是 一 个 文 本 文件 , 其 中 包 含 一 组 用 于 编 辑 输 出 对 象 符 号 表 的 命 令 。可 以 使 用 armlink 命 令 行 选 项 --edit file-list 来 指 定 控 制 文 件 ( 请 参 阅 第 2-5 页的 armlink 命 令 语 法 中 的 --edit 选 项 描 述 )。 如 果 指 定 多 个 控 制 文 件 , 可 以 使 用以 下 语 法 之 一 :armlink --edit file1 --edit file2 --edit file3armlink --edit file1,file2,file3不 要 在 逗 号 和 文 件 名 之 间 留 有 空 格 。4.4.1 控 制 文 件 格 式控 制 文 件 是 采 用 以 下 格 式 的 纯 文 本 文 件 :• 第 一 个 非 空 白 字 符 是 分 号 (;) 或 井 号 (#) 的 行 被 解 释 为 注 释 。 注 释 将 作 为 空行 处 理 。• 忽 略 空 行 。• 每 个 非 空 的 非 注 释 行 是 命 令 或 命 令 的 一 部 分 ( 拆 分 为 连 续 的 非 空 行 )。• 将 逗 号 (,) 作 为 最 后 一 个 非 空 白 字 符 结 束 的 命 令 行 将 在 下 一 个 非 空 行 继续 。每 个 命 令 行 由 一 个 命 令 以 及 后 面 的 一 组 或 多 组 以 逗 号 分 隔 的 操 作 数 组 成 。 每 组操 作 数 由 一 个 或 两 个 操 作 数 组 成 , 具 体 取 决 于 命 令 。 命 令 适 用 于 其 中 的 每 组 操作 数 。 以 下 规 则 适 用 :• 命 令 不 区 分 大 小 写 , 但 按 惯 例 以 大 写 字 母 显 示 。• 操 作 数 区 分 大 小 写 , 因 为 它 们 必 须 与 区 分 大 小 写 的 符 号 名 相 匹 配 。 您 可 以在 操 作 数 中 使 用 通 配 符 。命 令 仅 适 用 于 全 局 符 号 。 其 他 符 号 不 受 影 响 , 如 局 部 符 号 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-11


访 问 映 像 符 号4.4.2 控 制 文 件 命 令可 以 使 用 控 制 文 件 命 令 执 行 以 下 操 作 :• 管 理 符 号 表 中 的 符 号• 控 制 将 符 号 从 静 态 符 号 表 复 制 到 动 态 符 号 表 中 的 过 程• 存 储 有 关 链 接 单 元 所 依 赖 的 库 的 信 息 。注 意控 制 文 件 命 令 仅 控 制 全 局 符 号 。 局 部 符 号 不 受 任 何 命 令 的 影 响 。4-12 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号IMPORTIMPORT 命 令 指 定 符 号 是 运 行 时 在 共 享 对 象 中 定 义 的 。语 法IMPORT pattern [AS replacement_pattern] [,pattern [AS replacement_pattern]] *其 中 :pattern是 一 个 与 零 个 或 多 个 未 定 义 的 全 局 符 号 相 匹 配 的 字 符 串 , 可 以 选 择在 其 中 包 含 通 配 符 (* 或 ?)。 如 果 pattern 与 任 何 未 定 义 的 全 局 符号 均 不 匹 配 , 链 接 器 将 忽 略 该 命 令 。 此 操 作 数 只 能 与 未 定 义 的 全 局符 号 相 匹 配 。replacement_pattern是 一 个 要 将 未 定 义 的 全 局 符 号 重 命 名 为 的 字 符 串 , 可 以 选 择 在 其 中包 含 通 配 符 (* 或 ?)。 此 处 的 通 配 符 必 须 在 replacement_pattern 中具 有 对 应 的 通 配 符 。 replacement_pattern 通 配 符 匹 配 的 字 符 将 替 换pattern 通 配 符 。例 如 :IMPORT my_func AS func导 入 未 定 义 的 符 号 my_func, 并 将 其 重 命 名 为 func。用 法无 法 导 入 已 在 当 前 共 享 对 象 或 可 执 行 文 件 中 定 义 的 符 号 。 IMPORT 中 仅 允 许 使 用一 个 通 配 符 (* 或 ?)。如 果 动 态 符 号 表 存 在 , 则 将 未 定 义 的 符 号 包 括 在 动 态 符 号 表 中 ( 如 果 指 定 , 则 作为 replacement_pattern; 否 则 , 作 为 pattern)。注 意IMPORT 命 令 仅 影 响 未 定 义 的 全 局 符 号 。 共 享 库 已 解 析 的 符 号 将 隐 式 地 导 入 到 动态 符 号 表 中 。 链 接 器 忽 略 针 对 于 隐 式 导 入 的 符 号 的 任 何 IMPORT 指 令 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-13


访 问 映 像 符 号EXPORTEXPORT 命 令 指 定 可 以 由 其 他 共 享 对 象 或 可 执 行 文 件 访 问 符 号 。语 法EXPORT pattern [AS replacement_pattern] [,pattern [AS replacement_pattern]] *其 中 :pattern是 一 个 与 零 个 或 多 个 已 定 义 的 全 局 符 号 相 匹 配 的 字 符 串 , 可 以 选 择在 其 中 包 含 通 配 符 (* 或 ?)。 如 果 pattern 与 任 何 已 定 义 的 全 局 符号 均 不 匹 配 , 链 接 器 将 忽 略 该 命 令 。 此 操 作 数 只 能 与 已 定 义 的 全 局符 号 相 匹 配 。replacement_pattern是 一 个 要 将 已 定 义 的 全 局 符 号 重 命 名 为 的 字 符 串 , 可 以 选 择 在 其 中包 含 通 配 符 (* 或 ?)。 此 处 的 通 配 符 必 须 在 replacement_pattern 中具 有 对 应 的 通 配 符 。 replacement_pattern 通 配 符 匹 配 的 字 符 将 替 换pattern 通 配 符 。例 如 :EXPORT my_func AS func1将 已 定 义 的 符 号 my_func 重 命 名 为 func1 并 导 出 。用 法无 法 将 符 号 导 出 为 已 存 在 的 名 称 。 EXPORT 中 仅 允 许 使 用 一 个 通 配 符 (* 或 ?)。如 果 动 态 符 号 表 存 在 , 则 将 已 定 义 的 全 局 符 号 包 括 在 动 态 符 号 表 中 ( 如 果 指 定 ,则 作 为 replacement_pattern; 否 则 , 作 为 pattern)。4-14 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号RENAMERENAME 命 令 重 命 名 已 定 义 和 未 定 义 的 全 局 符 号 名 称 。语 法RENAME pattern AS replacement_pattern [,pattern AS replacement_pattern] *其 中 :pattern是 一 个 与 零 个 或 多 个 全 局 符 号 相 匹 配 的 字 符 串 , 可 以 选 择 在 其 中 包含 通 配 符 (* 或 ?)。 如 果 pattern 与 任 何 全 局 符 号 均 不 匹 配 , 链 接 器将 忽 略 该 命 令 。 此 操 作 数 可 以 与 已 定 义 和 未 定 义 的 符 号 相 匹 配 。replacement_pattern用 法是 一 个 要 将 符 号 重 命 名 为 的 字 符 串 , 可 以 选 择 在 其 中 包 含 通 配 符(* 或 ?)。 此 处 的 通 配 符 必 须 在 pattern 中 具 有 对 应 的 通 配 符 。pattern 通 配 符 匹 配 的 字 符 将 替 换 replacement_pattern 通 配 符 。例 如 , 对 于 名 为 func1 的 符 号 :RENAME f* AS my_f*将 func1 重 命 名 为 my_func1。无 法 将 符 号 重 命 名 为 已 存 在 的 符 号 名 , 即 使 正 在 重 命 名 目 标 符 号 名 本 身 。 RENAME中 仅 允 许 使 用 一 个 通 配 符 (* 或 ?)。 例 如 , 假 定 有 一 个 包 含 符 号 func1、func2 和func3 的 映 像 :EXPORT func1 AS func2RENAME func3 AS b2EXPORT func1 AS func3b2;invalid, func2 exists;invalid, func3 exists, even though it is renamed to链 接 器 在 执 行 任 何 替 换 之 前 先 处 理 控 制 文 件 。 因 此 , 不 能 在 第 1 行 中 使 用 RENAMEA AS B 并 在 第 2 行 中 使 用 RENAME B AS A。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-15


访 问 映 像 符 号RESOLVERESOLVE 命 令 将 未 定 义 的 特 定 引 用 与 已 定 义 的 全 局 符 号 相 匹 配 。语 法RESOLVE pattern AS defined_pattern其 中 :pattern是 一 个 必 须 与 已 定 义 的 全 局 符 号 相 匹 配 的 字 符 串 , 可 以 选 择 在 其 中包 含 通 配 符 。defined_pattern用 法是 一 个 与 零 个 或 多 个 已 定 义 的 全 局 符 号 相 匹 配 的 字 符 串 , 可 以 选 择在 其 中 包 含 通 配 符 。 如 果 defined_pattern 与 任 何 已 定 义 的 全 局 符 号均 不 匹 配 , 链 接 器 将 忽 略 该 命 令 。 无 法 将 未 定 义 的 引 用 与 未 定 义 的符 号 相 匹 配 。RESOLVE 是 现 有 armlink --unresolved 命 令 行 选 项 的 扩 展 。 不 同 之 处 在于 ,--unresolved 允 许 所 有 未 定 义 的 引 用 与 一 个 单 一 定 义 相 匹 配 ; 而 RESOLVE 允 许引 用 与 符 号 之 间 进 行 更 明 确 的 匹 配 。未 定 义 的 引 用 将 从 输 出 符 号 表 中 删 除 。RESOLVE 适 用 于 执 行 部 分 链 接 和 正 常 链 接 的 情 况 。例 如 , 您 可 能 使 用 两 个 名 为 file1.c 和 file2.c 的 文 件 , 如 第 4-17 页 的 示 例 4-4 中所 示 。 您 可 以 创 建 一 个 ed.txt 文 件 ( 包 含 一 行 RESOLVE MP3* AS MyMP3*), 然 后 执行 以 下 命 令 :armlink file1.o file2.o --edit ed.txt --unresolved foobar此 命 令 产 生 以 下 结 果 :• file1.o 中 的 引 用 (foo、MP3_Init() 和 MP3_Play()) 与 file2.o 中 的 定 义 ( 分 别为 foobar、MyMP3_Init() 和 MyMP3_Play()) 相 匹 配 , 这 是 由 控 制 文 件 ed.txt 指定 的 。• ed.txt 中 的 RESOLVE 命 令 与 MP3 函 数 相 匹 配 ; 而 --unresolved 选 项 与 任 何 其他 剩 余 的 引 用 相 匹 配 , 在 本 示 例 中 ,foo 与 foobar 相 匹 配 。• 输 出 符 号 表 ( 不 论 是 映 像 还 是 部 分 对 象 ) 不 包 含 foo、MP3_Init 或 MP3_Play符 号 。4-16 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号示 例 4-4 使 用 RESOLVE 命 令file1.cextern int foo;extern void MP3_Init(void);extern void MP3_Play(void);int main(void){int x = foo + 1;MP3_Init();MP3_Play();return x;}file2.c:int foobar;void MyMP3_Init(){}void MyMP3_Play(){}<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-17


访 问 映 像 符 号REQUIREREQUIRE 命 令 在 动 态 数 组 中 创 建 DT_NEEDED 标 签 。DT_NEEDED 标 签 指 定 与 应 用 程 序 使用 的 其 他 共 享 对 象 之 间 的 相 关 性 , 例 如 共 享 库 。语 法REQUIRE pattern [,pattern] *其 中 :pattern 是 表 示 文 件 名 的 字 符 串 。 不 允 许 使 用 通 配 符 。用 法链 接 器 将 值 为 pattern 的 DT_NEEDED 标 签 插 入 到 动 态 数 组 中 。 这 会 指 示 动 态 加 载程 序 , 它 当 前 所 加 载 的 文 件 需 要 加 载 pattern。注 意由 于 REQUIRE 命 令 而 插 入 的 DT_NEEDED 标 签 将 添 加 到 位 于 命 令 行 中 的 共 享 对 象 或DLL 生 成 的 DT_NEEDED 标 签 后 面 。4-18 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号HIDEHIDE 命 令 将 符 号 表 中 已 定 义 的 全 局 符 号 变 为 匿 名 符 号 。语 法HIDE pattern [,pattern] *其 中 :pattern是 一 个 与 零 个 或 多 个 已 定 义 的 全 局 符 号 相 匹 配 的 字 符 串 , 可 以 选 择在 其 中 包 含 通 配 符 。 如 果 pattern 与 任 何 已 定 义 的 全 局 符 号 均 不 匹配 , 链 接 器 将 忽 略 该 命 令 。 无 法 隐 藏 未 定 义 的 符 号 。用 法可 以 使 用 HIDE 和 SHOW, 将 输 出 映 像 或 部 分 链 接 的 对 象 中 的 某 些 全 局 符 号 变 为 匿名 对 象 。 可 以 将 在 目 标 文 件 或 库 中 隐 藏 符 号 作 为 一 种 保 护 知 识 产 权 的 方 法 , 如示 例 4-5 中 所 示 。 此 示 例 生 成 一 个 部 分 链 接 的 对 象 并 隐 藏 所 有 全 局 符 号 , 以 os_开 头 的 全 局 符 号 除 外 。示 例 4-5 使 用 HIDE 命 令steer.txtHIDE *SHOW os_*; Hides all global symbols; Shows all symbols beginning with 抩 s_í将 此 示 例 与 以 下 命 令 链 接 在 一 起 :armlink --partial input_object.o --edit steer.txt -o partial_object.o可 以 将 此 示 例 与 其 他 对 象 链 接 在 一 起 , 但 前 提 是 这 些 对 象 不 包 含 对 隐 藏 符 号 的引 用 。 如 果 在 输 出 对 象 中 隐 藏 了 符 号 , 后 续 链 接 步 骤 中 的 SHOW 命 令 对 这 些 符 号无 效 。 将 从 输 出 符 号 表 中 删 除 隐 藏 引 用 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-19


访 问 映 像 符 号SHOWSHOW 命 令 使 全 局 符 号 变 为 可 见 符 号 。 如 果 要 取 消 隐 藏 使 用 HIDE 命 令 和 通 配 符 隐藏 的 特 定 符 号 , 此 命 令 是 非 常 有 用 的 。语 法SHOW pattern [,pattern] *其 中 :pattern是 一 个 与 零 个 或 多 个 全 局 符 号 相 匹 配 的 字 符 串 , 可 以 选 择 在 其 中 包含 通 配 符 。 如 果 pattern 与 任 何 全 局 符 号 均 不 匹 配 , 链 接 器 将 忽 略该 命 令 。用 法SHOW 的 用 法 与 HIDE 的 用 法 密 切 相 关 。 有 关 其 他 信 息 , 请 参 阅 第 4-19 页 的 HIDE。4-20 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号4.5 使 用 $Super$$ 和 $Sub$$ 覆 盖 符 号 定 义在 某 些 情 况 下 , 无 法 修 改 现 有 符 号 , 例 如 , 由 于 符 号 位 于 外 部 库 或 ROM 代 码中 。可 以 使 用 $Super$$ 和 $Sub$$ 模 式 来 修 补 现 有 符 号 。例 如 , 要 修 补 函 数 foo() 的 定 义 , 请 按 如 下 方 式 使 用 $Super$$foo() 和 $Sub$$foo():$Super$$foo 标 识 未 修 补 的 原 始 函 数 foo()。 使 用 它 可 以 直 接 调 用 原 函 数 。$Sub$$foo标 识 调 用 的 新 函 数 , 而 不 是 原 始 函 数 foo()。 可 以 使 用 此 模 式 在 原始 函 数 之 前 或 之 后 添 加 处 理 。示 例 4-6 说 明 了 修 改 遗 留 函 数 foo() 而 导 致 调 用 ExtraFunc() 和 foo()。 有 关 详 细信 息 , 请 参 阅 install_directory\Documentation\Specifications\... 中 的 《<strong>ARM</strong>ELF 规 范 》 和 aaelf.pdf。示 例 4-6 使 用 $Super$$ 和 $Sub$$extern void ExtraFunc(void);extern void $Super$$foo(void):/* this function is called instead of the original foo() */void $Sub$$foo(void){ExtraFunc(); /* does some extra setup work */$Super$$foo(); /* calls the original foo() function */}<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-21


访 问 映 像 符 号4.6 符 号 版 本 控 制链 接 器 符 合 BPABI 并 支 持 符 号 版 本 。符 号 版 本 控 制 记 录 有 关 从 动 态 共 享 对 象 中 导 入 或 由 其 导 出 的 符 号 的 额 外 信 息 。动 态 加 载 程 序 使 用 此 额 外 信 息 来 确 保 , 可 以 在 加 载 时 使 用 映 像 所 需 的 所 有 符 号 。通 过 进 行 符 号 版 本 控 制 , 共 享 对 象 创 建 者 可 以 生 成 新 的 符 号 版 本 以 供 所 有 新 客户 机 使 用 , 同 时 与 链 接 到 旧 版 本 的 共 享 对 象 上 的 客 户 机 保 持 兼 容 。4.6.1 版 本符 号 版 本 控 制 将 版 本 概 念 添 加 到 动 态 符 号 表 中 。 版 本 是 与 符 号 关 联 的 名 称 。 当动 态 加 载 程 序 尝 试 解 析 与 版 本 名 称 关 联 的 符 号 引 用 时 , 它 只 能 与 具 有 相 同 版 本名 称 的 符 号 定 义 相 匹 配 。注 意版 本 可 能 与 以 前 的 版 本 名 称 相 关 联 以 显 示 共 享 对 象 的 修 订 历 史 记 录 。4.6.2 缺 省 版 本尽 管 共 享 对 象 可 能 具 有 同 一 符 号 的 多 个 版 本 , 但 共 享 对 象 的 客 户 机 只 能 绑 定 到最 新 版 本 上 。它 称 为 符 号 的 缺 省 版 本 。4.6.3 创 建 区 分 版 本 的 符 号缺 省 情 况 下 , 链 接 器 不 会 为 非 BPABI 共 享 对 象 创 建 区 分 版 本 的 符 号 。嵌 入 的 符 号可 以 将 特 别 命 名 的 符 号 添 加 到 输 入 对 象 中 , 而 导 致 链 接 器 创 建 符 号 版 本 。 这 些符 号 的 格 式 为 :• name@version, 适 用 于 非 缺 省 符 号 版 本• name@@version, 适 用 于 缺 省 符 号 版 本 。您 必 须 在 函 数 或 数 据 地 址 中 定 义 要 导 出 的 符 号 。 符 号 名 称 分 为 两 个 部 分 : 符 号 名称 name 和 版 本 定 义 version。 name 将 添 加 到 动 态 符 号 表 中 , 并 变 为 共 享 对 象 接 口的 一 部 分 。ver 将 创 建 一 个 名 为 ver 的 版 本 ( 如 果 尚 未 存 在 ), 并 将 name 与 名 为ver 的 版 本 相 关 联 。4-22 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


访 问 映 像 符 号有 关 如 何 创 建 版 本 符 号 的 详 细 信 息 , 请 参 阅 介 绍 以 下 内 容 的 章 节 :• 《 编 译 器 用 户 指 南 》 中 的 第 2-25 页 的 添 加 符 号 版 本• 《 汇 编 程 序 指 南 》 中 的 “ 如 何 编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言 ”。示 例 4-7 将 符 号 foo@ver1、foo@@ver2 和 bar@@ver1 放 到 对 象 符 号 表 中 :示 例 4-7 创 建 区 分 版 本 的 符 号 、 嵌 入 的 符 号int old_function(void) __asm__("foo@ver1");int new_function(void) __asm__("foo@@ver2");int other_function(void) __asm__("bar@@ver1");链 接 器 读 取 这 些 符 号 , 并 创 建 版 本 定 义 ver1 和 ver2。 符 号 foo 与 ver1 的 非 缺 省 版本 以 及 ver2 的 缺 省 版 本 相 关 联 。 符 号 bar 与 ver1 的 缺 省 版 本 相 关 联 。不 能 通 过 这 种 方 法 在 版 本 之 间 创 建 关 联 。控 制 文 件可 以 在 命 令 行 选 项 --symver_script file 指 定 的 脚 本 文 件 中 嵌 入 命 令 以 生 成 符 号版 本 。 通 过 使 用 此 选 项 , 可 自 动 启 用 符 号 版 本 控 制 。脚 本 文 件 支 持 与 GNU ld 链 接 器 相 同 的 语 法 。通 过 使 用 脚 本 文 件 , 您 可 以 将 版 本 与 以 前 的 版 本 相 关 联 。除 了 嵌 入 的 符 号 方 法 外 , 还 可 以 提 供 控 制 文 件 。 如 果 选 择 这 样 做 , 脚 本 文 件 必 须与 嵌 入 的 符 号 相 匹 配 并 使 用 Backus-Naur 格 式 (BNF) 表 示 法 :version_definition ::=version_name "{" symbol_association* "}" [depend_version] ";"version_name 是 一 个 包 含 版 本 名 称 的 字 符 串 。depend_version 是 一 个 包 含 此version_name 所 依 赖 的 版 本 名 称 的 字 符 串 。 您 必 须 已 在 脚 本 文 件 中 定 义 了 此 版本 。 版 本 名 称 并 不 重 要 , 但 有 助 于 选 择 可 读 性 较 高 的 名 称 , 例 如 :symbol_association ::="local:" | "global:" | symbol_name ";"<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 4-23


访 问 映 像 符 号其 中 :• "local:" 指 示 此 版 本 定 义 中 的 所 有 后 续 symbol_name 均 是 共 享 对 象 的 本 地 名称 , 并 且 不 区 分 版 本 。• "global:" 指 示 所 有 后 续 symbol_name 属 于 此 版 本 定 义 。每 个 版 本 定 义 开 头 都 有 一 个 隐 式 "global:"。• symbol_name 是 静 态 符 号 表 中 的 全 局 符 号 的 名 称 。示 例 4-8 说 明 了 一 个 控 制 文 件 , 它 对 应 于 嵌 入 的 符 号 示 例 ( 第 4-23 页 的 示例 4-7), 并 添 加 了 相 关 性 信 息 以 使 ver2 依 赖 于 ver1:示 例 4-8 创 建 区 分 版 本 的 符 号 、 控 制 文 件ver1{global:foo; bar;local:*;};ver2{global:foo;} ver1;错 误 和 警 告如 果 使 用 脚 本 文 件 , 版 本 定 义 与 其 关 联 的 符 号 必 须 匹 配 。 如 果 链 接 器 检 测 到 任何 不 匹 配 的 情 况 , 则 会 发 出 警 告 。文 件 名可 以 使 用 命 令 行 选 项 --symver_soname 打 开 隐 式 符 号 版 本 控 制 。 如 果 需 要 对 符 号进 行 版 本 控 制 以 强 制 进 行 静 态 绑 定 , 而 并 不 关 心 为 其 指 定 的 版 本 号 , 则 可 以 使 用此 选 项 。如 果 符 号 没 有 已 定 义 的 版 本 , 链 接 器 将 使 用 所 链 接 的 文 件 的 SONAME。无 法 将 此 选 项 与 嵌 入 的 符 号 或 脚 本 文 件 配 合 使 用 。4-24 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


第 5 章使 用 分 散 加 载 描 述 文 件本 章 介 绍 了 如 何 将 <strong>ARM</strong> 链 接 器 armlink 与 分 散 加 载 描 述 文 件 配 合 使 用 以 创 建 复杂 映 像 。 它 包 含 以 下 几 节 :• 第 5-2 页 的 关 于 分 散 加 载• 第 5-9 页 的 分 散 加 载 描 述 文 件 的 形 式 语 法• 第 5-31 页 的 指 定 区 和 节 地 址 的 示 例• 第 5-46 页 的 简 单 映 像 的 等 效 分 散 加 载 描 述<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-1


使 用 分 散 加 载 描 述 文 件5.1 关 于 分 散 加 载映 像 由 区 和 输 出 节 组 成 。 映 像 中 的 每 个 区 可 以 包 含 不 同 的 加 载 和 执 行 地 址 。 有关 详 细 信 息 , 请 参 阅 第 3-2 页 的 指 定 映 像 结 构 。要 构 建 映 像 的 内 存 映 射 , 链 接 器 必 须 具 有 :• 描 述 如 何 将 输 入 节 划 分 到 区 中 的 分 组 信 息• 描 述 区 位 于 内 存 映 射 中 的 地 址 的 位 置 信 息 。通 过 使 用 分 散 加 载 机 制 , 您 可 以 使 用 文 本 文 件 中 的 描 述 为 链 接 器 指 定 映 像 的 内存 映 射 。 分 散 加 载 为 您 提 供 了 对 映 像 组 件 分 组 和 位 置 的 全 面 控 制 。 分 散 加 载 可以 用 于 简 单 映 像 , 但 它 通 常 仅 用 于 具 有 复 杂 内 存 映 射 的 映 像 , 即 多 个 区 在 加 载 和执 行 时 分 散 在 内 存 映 射 中 。5.1.1 为 分 散 加 载 定 义 的 符 号当 链 接 器 使 用 分 散 加 载 描 述 文 件 创 建 映 像 时 , 它 会 创 建 一 些 与 区 相 关 的 符 号 。第 4-3 页 的 与 区 相 关 的 符 号 对 这 些 符 号 进 行 了 介 绍 。 仅 当 代 码 引 用 这 些 特 殊 符号 时 , 链 接 器 才 会 创 建 它 们 。未 定 义 的 符 号请 注 意 , 在 使 用 分 散 加 载 描 述 文 件 时 , 不 会 定 义 以 下 符 号 :• Image$$RW$$Base• Image$$RW$$Limit• Image$$RO$$Base• Image$$RO$$Limit• Image$$ZI$$Base• Image$$ZI$$Limit有 关 详 细 信 息 , 请 参 阅 第 4-3 页 的 访 问 链 接 器 定 义 的 符 号 。如 果 使 用 分 散 加 载 描 述 文 件 , 但 没 有 指 定 任 何 特 殊 区 名 称 , 并 且 没 有 重 新 实 现__user_initial_stackheap(), 库 将 生 成 一 条 错 误 消 息 :Error: L6915E: Library reports error: scatter-load file declares no heap orstack regions and __user_initial_stackheap is not defined.5-2 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件有 关 详 细 信 息 , 请 参 阅 :• 《 库 和 浮 点 支 持 指 南 》 中 的 第 2 章 C 和 C++ 库 , 以 了 解 有 关 库 内 存 模 型 的详 细 信 息• 《 开 发 指 南 》 中 的 第 2 章 嵌 入 式 软 件 开 发 。5.1.2 使 用 分 散 加 载 描 述 文 件 指 定 堆 栈 和 堆<strong>ARM</strong> C 库 提 供 了 替 代 的 __user_initial_stackheap() 函 数 实 现 , 可 以 通 过 分 散 加载 描 述 文 件 中 给 出 的 信 息 自 动 选 择 正 确 的 函 数 实 现 。要 选 择 两 个 区 内 存 模 型 , 请 在 分 散 加 载 描 述 文 件 中 定 义 两 个 名 为 <strong>ARM</strong>_LIB_HEAP 和<strong>ARM</strong>_LIB_STACK 的 特 殊 执 行 区 。 两 个 区 均 具 有 EMPTY 属 性 。 这 导 致 库 选 择 使 用 以 下符 号 值 的 非 缺 省 __user_initial_stackheap() 实 现 :• Image$$<strong>ARM</strong>_LIB_STACK$$Base• Image$$<strong>ARM</strong>_LIB_STACK$$ZI$$Limit• Image$$<strong>ARM</strong>_LIB_HEAP$$Base• Image$$<strong>ARM</strong>_LIB_HEAP$$ZI$$Limit只 能 指 定 一 个 <strong>ARM</strong>_LIB_STACK 或 <strong>ARM</strong>_LIB_HEAP 区 , 并 且 必 须 分 配 大 小 , 例 如 :<strong>ARM</strong>_LIB_HEAP 0x20100000 EMPTY 0x100000-0x8000<strong>ARM</strong>_LIB_STACK 0x20200000 EMPTY -0x8000; Heap starts at 1MB; and grows upwards; Stack space starts at the end; of the 2MB of RAM; And grows downwards for 32KB可 以 使 用 EMPTY 属 性 定 义 单 个 名 为 <strong>ARM</strong>_LIB_STACKHEAP 的 执 行 区 , 强 制__user_initial_stackheap() 使 用 合 并 的 堆 栈 / 堆 区 。 这 导 致__user_initial_stackheap() 使 用 符 号 Image$$<strong>ARM</strong>_LIB_STACKHEAP$$Base 和Image$$<strong>ARM</strong>_LIB_STACKHEAP$$ZI$$Limit 的 值 。注 意如 果 重 新 实 现 __user_initial_stackheap(), 这 将 覆 盖 所 有 库 实 现 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-3


使 用 分 散 加 载 描 述 文 件5.1.3 何 时 使 用 分 散 加 载链 接 器 的 命 令 行 选 项 提 供 了 一 些 对 数 据 和 代 码 位 置 的 控 制 , 但 要 对 位 置 进 行 全面 控 制 , 则 需 要 使 用 比 命 令 行 中 的 输 入 内 容 更 详 细 的 指 令 。 需 要 或 最 好 使 用 分散 加 载 描 述 的 情 况 包 括 :复 杂 内 存 映 射如 果 必 须 将 代 码 和 数 据 放 在 多 个 不 同 的 内 存 区 域 中 , 则 需 要 使 用 详细 指 令 指 定 将 哪 个 节 放 在 哪 个 内 存 空 间 中 。不 同 类 型 的 内 存许 多 系 统 都 包 含 多 种 不 同 的 物 理 内 存 设 备 , 如 闪 存 、ROM、SDRAM 和 快 速 SRAM。 分 散 加 载 描 述 可 以 将 代 码 和 数 据 与 最 适 合的 内 存 类 型 相 匹 配 。 例 如 , 可 以 将 中 断 代 码 放 在 快 速 SRAM 中 以 缩短 中 断 等 待 时 间 , 而 将 不 经 常 使 用 的 配 置 信 息 放 在 较 慢 的 闪 存 中 。内 存 映 射 的 I/O分 散 加 载 描 述 可 以 将 数 据 节 准 确 放 在 内 存 映 射 中 的 某 个 地 址 , 以 便能 够 访 问 内 存 映 射 的 外 围 设 备 。位 于 固 定 位 置 的 函 数可 以 将 函 数 放 在 内 存 中 的 相 同 位 置 , 即 使 已 修 改 并 重 新 编 译 周 围 的应 用 程 序 。使 用 符 号 标 识 堆 和 堆 栈链 接 应 用 程 序 时 , 可 以 为 堆 和 堆 栈 位 置 定 义 一 些 符 号 。因 此 , 几 乎 总 是 需 要 使 用 分 散 加 载 来 实 现 嵌 入 式 系 统 , 因 为 这 些 系 统 使 用ROM、RAM 和 内 存 映 射 的 I/O。注 意如 果 针 对 Cortex-M3 处 理 器 进 行 编 译 , 则 会 包 括 固 定 的 内 存 映 射 , 因 此 , 可 以 使用 分 散 加 载 描 述 文 件 来 定 义 堆 栈 和 堆 。 其 中 的 一 个 示 例 是 在 主 示 例 目 录install_directory\RVDS\Examples 中 作 为 Cortex-M3.scat 提 供 的 。5-4 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件5.1.4 分 散 加 载 命 令 行 选 项用 于 分 散 加 载 的 armlink 命 令 行 选 项 为 :--scatter description_file它 指 示 链 接 器 按 照 description_file 所 述 构 建 映 像 内 存 映 射 。 第 5-9 页 的 分 散 加载 描 述 文 件 的 形 式 语 法 介 绍 了 描 述 文 件 格 式 。有 关 分 散 加 载 描 述 文 件 的 其 他 信 息 , 请 参 阅 :• 第 5-31 页 的 指 定 区 和 节 地 址 的 示 例• 第 5-46 页 的 简 单 映 像 的 等 效 分 散 加 载 描 述• 《 开 发 指 南 》 中 的 第 2 章 嵌 入 式 软 件 开 发 。5.1.5 具 有 简 单 内 存 映 射 的 映 像第 5-6 页 的 图 5-1 中 的 分 散 加 载 描 述 将 目 标 文 件 中 的 段 加 载 到 内 存 中 , 它 与第 5-6 页 的 图 5-2 中 所 示 的 映 射 相 对 应 。 区 最 大 大 小 说 明 是 可 选 的 , 如 果 包 含 这些 内 容 , 则 链 接 器 能 够 检 查 区 是 否 超 出 其 边 界 。在 此 示 例 中 , 可 通 过 将 --ro-base 0x0 和 --rw-base 0x10000 指 定 为 链 接 器 命 令 行 选项 来 获 得 相 同 的 结 果 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-5


使 用 分 散 加 载 描 述 文 件Name ofload regionName of firstexec regionName of secondexec regionStart of secondexec regionLOAD_ROM 0x0000 0x8000{}EXEC_ROM 0x0000 0x8000{* (+RO)}RAM 0x10000 0x6000{* (+RW,+ZI)}Start address forload regionMaximum size ofload regionStart address forexec regionMaximum size of thisexec regionPlace all code andRO data into thisexec regionMaximum size ofthis exec regionPlace all RW and ZI datainto this exec region图 5-1 分 散 加 载 描 述 文 件 中 的 简 单 内 存 映 射Load viewExecution view0x16000Zero fillZI sectionRW sectionSRAM0x10000RW sectionRO sectionCopy / decompressRO section0x8000ROM0x0000图 5-2 简 单 分 散 加 载 内 存 映 射5-6 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件5.1.6 具 有 复 杂 内 存 映 射 的 映 像图 5-3 中 的 分 散 加 载 描 述 将 program1.o 和 program2.o 文 件 中 的 段 加 载 到 内 存 中 ,它 与 第 5-8 页 的 图 5-4 中 所 示 的 映 射 相 对 应 。与 第 5-6 页 的 图 5-2 中 所 示 的 简 单 内 存 映 射 不 同 , 不 能 只 通 过 使 用 基 本 命 令 行 选项 为 链 接 器 指 定 此 应 用 程 序 。小 心图 5-3 中 的 分 散 加 载 描 述 仅 指 定 program1.o 和 program2.o 的 代 码 和 数 据 位 置 。 如果 链 接 其 他 模 块 ( 如 program3.o) 并 使 用 此 描 述 文 件 , 则 不 会 指 定 program3.o 的 代码 和 数 据 位 置 。除 非 对 代 码 和 数 据 位 置 的 要 求 非 常 严 格 , 否 则 建 议 使 用 * 或 .ANY 说 明 符 来 放 置其 余 代 码 和 数 据 。 有 关 详 细 信 息 , 请 参 阅 第 5-33 页 的 将 区 放 在 固 定 地 址 中 。LOAD_ROM_1 0x0000{EXEC_ROM_1 0x0000{program1.o (+RO)}}DRAM 0x18000 0x8000{program1.o (+RW,+ZI)}LOAD_ROM_2 0x4000{EXEC_ROM_2 0x4000{program2.o (+RO)}Start address for first load regionStart address for first exec regionPlace all code and RO data fromprogram1.o into this exec regionStart address for this exec regionMaximum size of this exec regionPlace all RW and ZI data fromprogram1.o into this exec regionStart address for second load regionPlace all code and RO data fromprogram2.o into this exec region}SRAM 0x8000 0x8000{program2.o (+RW,+ZI)}Place all RW and ZI data fromprogram2.o into this exec region图 5-3 分 散 加 载 描 述 文 件 中 的 复 杂 内 存 映 射<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-7


使 用 分 散 加 载 描 述 文 件Load viewExecution view0x20000Zero fillZI section#2RW section#1DRAM0x180000x10000ZI section#1SRAM0x4000RW section#2RO section#2RW section#2RO section#20x08000ROM20x0000RW section#1RO section#1RO section#1ROM10x00000图 5-4 复 杂 分 散 加 载 内 存 映 射5-8 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件5.2 分 散 加 载 描 述 文 件 的 形 式 语 法分 散 加 载 描 述 文 件 是 一 个 文 本 文 件 , 它 向 链 接 器 描 述 目 标 嵌 入 式 产 品 的 内 存 映射 。 如 果 从 命 令 行 中 使 用 链 接 器 , 则 描 述 文 件 的 文 件 扩 展 名 并 不 重 要 。 可 通 过描 述 文 件 来 指 定 以 下 内 容 :• 每 个 加 载 区 的 加 载 地 址 和 最 大 大 小• 每 个 加 载 区 的 属 性• 从 每 个 加 载 区 派 生 的 执 行 区• 每 个 执 行 区 的 执 行 地 址 和 最 大 大 小• 每 个 执 行 区 的 输 入 节 。描 述 文 件 格 式 反 映 了 加 载 区 、 执 行 区 和 输 入 节 的 层 次 结 构 。注 意为 区 分 配 输 入 节 的 方 式 与 在 分 散 加 载 描 述 文 件 中 写 入 选 择 模 式 的 顺 序 完 全 无关 。 如 果 选 择 模 式 与 文 件 / 节 名 称 或 节 属 性 之 间 具 有 最 佳 匹 配 , 则 可 获 得 最 佳 性能 。 请 参 阅 第 5-23 页 的 解 析 多 个 匹 配 。5.2.1 BNF 表 示 法 和 语 法表 5-1 简 要 说 明 了 用 于 描 述 形 式 语 言 的 Backus-Naur 格 式 (BNF) 符 号 。表 5-1 BNF 语 法符 号说 明" 引 号 用 于 指 示 , 通 常 作 为 BNF 语 法 一 部 分 的 字 符 将 用 作 定 义 中 的 文 字字 符 。 例 如 , 只 能 将 定 义 B"+"C 替 换 为 模 式 B+C; 而 可 以 将 定 义 B+C 替 换为 BC、BBC 或 BBBC。A ::= B[A]将 A 定 义 为 B。 例 如 ,A::= B"+" | C 表 示 A 等 效 于 B+ 或 C。 ::= 表 示 法 用于 以 组 件 形 式 定 义 更 高 级 别 的 结 构 。 每 个 组 件 也 可 能 具 有 ::= 定 义 , 以便 以 甚 至 更 简 单 的 组 件 对 其 进 行 定 义 。 例 如 ,A::= B 和 B::= C | D 表 示 定义 A 等 效 于 模 式 C 或 D。可 选 元 素 A。 例 如 ,A::= B[C]D 表 示 定 义 A 可 以 扩 展 为 BD 或 BCD。A+ 元 素 A 可 能 出 现 一 次 或 多 次 。 例 如 ,A::= B+ 表 示 定 义 A 可 以 扩 展 为 B、BB或 BBB。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-9


使 用 分 散 加 载 描 述 文 件表 5-1 BNF 语 法 ( 续 )符 号说 明A* 元 素 A 可 能 不 出 现 或 出 现 多 次 。A | B 可 能 出 现 元 素 A 或 B, 但 不 能 同 时 出 现 。(A B) 元 素 A 和 B 组 合 在 一 起 。 在 使 用 | 运 算 符 时 或 重 复 复 杂 模 式 时 , 这 种 组合 特 别 有 用 。 例 如 ,A::=(B C)+ (D | E) 表 示 定 义 A 可 以 扩 展 为 BCD、BCE、BCBCD、BCBCE、BCBCBCD 或 BCBCBCE 中 的 任 何 一 个 。5.2.2 分 散 加 载 描 述 文 件 语 法 概 述注 意在 本 节 的 BNF 定 义 中 , 添 加 了 换 行 符 和 空 格 以 提 高 可 读 性 。 分 散 加 载 定 义 中 不需 要 使 用 这 些 字 符 , 如 果 文 件 中 包 含 这 些 字 符 , 则 会 将 其 忽 略 。scatter_description 被 定 义 为 一 个 或 多 个 load_region_description 模 式 :Scatter_description ::=load_region_description+load_region_description 被 定 义 为 加 载 区 名 称 、 后 面 的 属 性 或 大 小 说 明 符 ( 可 选 )以 及 一 个 或 多 个 执 行 区 描 述 :load_region_description ::=load_region_name (base_address | ("+" offset)) [attributes] [max_size]"{"execution_region_description+"}"execution_region_description 被 定 义 为 执 行 区 名 称 、 指 定 的 基 址 、 后 面 的 属 性 或大 小 说 明 符 ( 可 选 ) 以 及 一 个 或 多 个 输 入 节 描 述 :execution_region_description ::=exec_region_name (base_address | "+" offset) [attribute_list][max_size | "-" length]"{"input_section_description*"}"5-10 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件input_section_description 被 定 义 为 源 模 块 选 择 器 模 式 以 及 后 面 的 输 入 节 选 择 器( 可 选 ):input_section_description ::=module_select_pattern[ "(" input_section_selector ( "," input_section_selector )* ")" ]input_section_selector ::=("+" input_section_attr | input_section_pattern | input_symbol_pattern)图 5-5 显 示 了 一 个 典 型 分 散 加 载 描 述 文 件 的 内 容 和 组 织 结 构 。Scatter descriptionLOAD_ROM_1 0x0000{}EXEC_ROM_1 0x0000{program1.o (+RO)}DRAM 0x18000 0x8000{program1.o (+RW,+ZI)}LOAD_ROM_2 0x4000{}EXEC_ROM_2 0x4000{program2.o (+RO)}SRAM 0x8000 0x8000{program2.o (+RW,+ZI)}Load region descriptionExecution region descriptionInput section descriptionExecution region descriptionInput section descriptionLoad region descriptionExecution region descriptionInput section descriptionExecution region descriptionInput section descriptionModule selector patternInput section attributes图 5-5 分 散 加 载 文 件 定 义 组 件<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-11


使 用 分 散 加 载 描 述 文 件5.2.3 加 载 区 描 述加 载 区 具 有 :• 名 称 ( 链 接 器 使 用 它 来 识 别 不 同 的 加 载 区 )• 基 址 ( 加 载 视 图 中 的 代 码 和 数 据 的 开 始 地 址 )• 属 性 ( 可 选 )• 最 大 大 小 ( 可 选 )• 执 行 区 列 表 ( 用 于 指 定 执 行 视 图 中 模 块 的 类 型 和 位 置 )。图 5-6 显 示 了 典 型 加 载 区 描 述 组 件 。LOAD_ROM_1 0x0000{EXEC_ROM_1 0x0000{program1.o (+RO)}Load region descriptionA load region description containsone or more execution regiondescriptions}DRAM 0x18000 0x8000{program1.o (+RW,+ZI)}图 5-6 加 载 区 描 述 组 件BNF 语 法 为 :load_region_description ::=load_region_name (base_address | ("+" offset)) [attribute_list] [max_size]"{"execution_region_description+"}"其 中 :load_region_name链 接 器 为 每 个 执 行 区 生 成 一 个 Load$$exec_region_name$$base符 号 。 此 符 号 存 储 执 行 区 的 加 载 地 址 ( 请 参 阅 第 5-15 页 的 执行 区 描 述 )。 但 是 ,load_region_name 仅 用 于 标 识 每 个 区 , 即 ,它 不 用 于 生 成 Load$$region_name 符 号 。5-12 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件注 意为 供 调 试 器 使 用 而 创 建 的 映 像 要 求 每 个 区 具 有 唯 一 的 基 址 ,因 为 调 试 器 必 须 在 各 个 区 的 加 载 地 址 加 载 它 们 。 如 果 加 载 区地 址 重 叠 , 则 会 导 致 覆 盖 部 分 映 像 。但 是 , 加 载 程 序 或 操 作 系 统 可 以 正 确 加 载 与 位 置 无 关 的 重 叠区 。 一 个 或 多 个 与 位 置 无 关 的 区 将 自 动 移 到 不 同 的 地 址 。base_address指 定 要 在 其 中 链 接 区 中 对 象 的 地 址 。base_address 必 须 是 字对 齐 的 。+offset 描 述 一 个 基 址 , 它 超 出 前 一 个 加 载 区 末 尾 offset 个 字 节 。offset 的 值 必 须 能 被 4 整 除 。 如 果 这 是 第 一 个 加 载 区 , 则+offset 表 示 基 址 从 加 载 区 基 址 后 面 的 offset 个 字 节 开 始 。attribute_list 指 定 加 载 区 内 容 的 属 性 :ABSOLUTE 绝 对 地 址 。PI 与 位 置 无 关 。RELOC 可 重 定 位 。OVERLAY 覆 盖 。NOCOMPRESS 不 能 进 行 压 缩 。ALIGN alignment 将 加 载 区 的 对 齐 约 束 从 4 增 加 到alignment。 alignment 必 须 为 2 的 正 数 幂 。如 果 加 载 区 具 有 base_address, 则 它 必 须为 alignment 对 齐 。 如 果 加 载 区 具 有+offset, 则 链 接 器 将 计 算 的 区 基 址 与alignment 边 界 对 齐 。您 只 能 指 定 ABSOLUTE、PI、RELOC 和 OVERLAY 属 性 之 一 。 缺 省 加载 区 属 性 是 ABSOLUTE。具 有 PI、RELOC 或 OVERLAY 属 性 之 一 的 加 载 区 可 能 具 有 重 叠 的地 址 范 围 。 对 于 ABSOLUTE 加 载 区 , 链 接 器 将 重 叠 的 地 址 范 围作 为 错 误 处 理 。OVERLAY 关 键 字 允 许 同 一 个 地 址 中 有 多 个 执 行 区 。 <strong>ARM</strong> 在RVCT 中 没 有 提 供 覆 盖 机 制 。 因 此 , 要 在 同 一 个 地 址 中 使 用多 个 执 行 区 , 您 必 须 提 供 自 己 的 覆 盖 管 理 器 。缺 省 情 况 下 , 将 启 用 RW 数 据 压 缩 。 通 过 使 用 NOCOMPRESS 关键 字 , 可 以 指 定 不 能 在 最 终 映 像 中 压 缩 加 载 区 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-13


使 用 分 散 加 载 描 述 文 件max_size指 定 加 载 区 的 最 大 大 小 。 如 果 指 定 可 选 的 max_size 值 , 并 且为 区 分 配 的 字 节 数 超 过 max_size 个 ,armlink 将 生 成 错 误 。execution_region_description指 定 执 行 区 名 称 、 地 址 和 内 容 。 请 参 阅 第 5-15 页 的 执 行 区 描述 。5-14 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件5.2.4 执 行 区 描 述执 行 区 具 有 :• 名 称• 基 址 ( 绝 对 或 相 对 地 址 )• 指 定 的 最 大 大 小 ( 可 选 )• 指 定 执 行 区 特 性 的 属 性• 一 个 或 多 个 输 入 节 描 述 ( 放 在 此 执 行 区 中 的 模 块 )。图 5-7 显 示 了 典 型 执 行 区 描 述 组 件 。EXEC_ROM_1 0x0000{program1.o (+RO)}Execution region descriptionAn execution region description containsone or more input section descriptions图 5-7 执 行 区 描 述 组 件BNF 语 法 为 :execution_region_description ::=exec_region_name (base_address | "+" offset) [attribute_list] [max_size | "-" length]"{"input_section_description*"}"其 中 :exec_region_name 命 名 执 行 区 。base_address 指 定 链 接 区 中 对 象 的 地 址 。base_address 必 须 是 字 对 齐 的 。+offset 描 述 一 个 基 址 , 它 超 出 前 一 个 执 行 区 末 尾 offset 个 字 节 。offset 的 值 必 须 能 被 4 整 除 。如 果 前 面 没 有 执 行 区 ( 即 , 这 是 加 载 区 中 的 第 一 个 执 行 区 ),则 +offset 表 示 基 址 从 它 所 在 的 加 载 区 的 基 址 后 面 offset 个字 节 开 始 。如 果 使 用 +offset 格 式 , 并 且 所 在 的 加 载 区 具 有 RELOC 属 性 ,则 执 行 区 继 承 RELOC 属 性 。 但 是 , 如 果 使 用 固 定base_address, 则 以 后 出 现 的 offset 不 继 承 RELOC 属 性 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-15


使 用 分 散 加 载 描 述 文 件attribute_list 它 指 定 执 行 区 内 容 的 属 性 :ABSOLUTE绝 对 地 址 。 区 执 行 地 址 是 由 基 址 指 示 符指 定 的 。PI 与 位 置 无 关 。OVERLAY 覆 盖 。FIXEDALIGN alignmentEMPTYZEROPADPADVALUE固 定 地 址 。 区 加 载 地 址 和 执 行 地 址 都 是由 基 址 指 示 符 指 定 的 ( 该 区 是 根 区 )。 请参 阅 第 5-31 页 的 创 建 根 执 行 区 。 基 址 指示 符 必 须 是 绝 对 基 址 , 或 者 偏 移 为 +0。将 执 行 区 的 对 齐 约 束 从 4 增 加 到alignment。 alignment 必 须 为 2 的 正 数 幂 。如 果 执 行 区 具 有 base_address, 则 它 必 须为 alignment 对 齐 。 如 果 执 行 区 具 有+offset, 则 链 接 器 将 计 算 的 区 基 址 与alignment 边 界 对 齐 。在 执 行 区 中 保 留 一 个 给 定 长 度 的 空 白 内存 块 , 通 常 供 堆 或 堆 栈 使 用 。 有 关 其 他信 息 , 请 参 阅 第 5-41 页 的 保 留 空 白 区 。零 初 始 化 的 节 作 为 零 填 充 块 写 入 ELF 文件 , 因 此 , 运 行 时 无 需 使 用 零 进 行 填 充 。在 某 些 情 况 下 ( 例 如 模 拟 ), 长 时 间 的 零循 环 是 比 较 合 适 的 。定 义 任 何 填 充 的 值 。 如 果 指 定 PADVALUE,则 必 须 为 其 赋 值 , 例 如 :EXEC 0x10000 PADVALUE 0xffffffff EMPTYZEROPAD 0x2000它 将 创 建 一 个 大 小 为 0x2000 且 完 全 是0xffffffff 的 区 。PADVALUE 的 大 小 必 须 为 一 个 字 。 将 忽 略 加载 区 中 的 PADVALUE 属 性 。FILL创 建 一 个 链 接 器 生 成 的 区 , 其 中 包 含 一个 值 。 如 果 指 定 FILL, 则 必 须 为 其 赋 值 ,例 如 :FILL 0xffffffff。 FILL 属 性 将 替 代以 下 组 合 :EMPTY ZEROPAD PADVALUE。在 某 些 情 况 下 ( 例 如 模 拟 ), 长 时 间 的 零循 环 是 比 较 合 适 的 。NOCOMPRESS 不 能 进 行 压 缩 。5-16 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件UNINIT 不 能 进 行 零 初 始 化 。max_size 一 个 可 选 的 数 字 , 如 果 为 区 分 配 的 字 节 数 超 过 max_size 个 ,则 会 指 示 链 接 器 生 成 错 误 。-ength 如 果 指 定 的 长 度 为 负 值 , 则 将 base_address 作 为 区 结 束 地 址 。它 通 常 与 EMPTY 一 起 使 用 , 以 表 示 在 内 存 中 变 小 的 堆 栈 。 有关 详 细 信 息 , 请 参 阅 第 5-41 页 的 保 留 空 白 区 。input_section_description指 定 执 行 区 属 性 时 :指 定 输 入 节 的 内 容 。 请 参 阅 第 5-18 页 的 输 入 节 描 述 。• 执 行 区 必 须 为 ABSOLUTE、PI 或 OVERLAY 属 性 之 一 。 如 果 未 指 定 任 何 属 性 , 则ABSOLUTE 是 执 行 区 的 缺 省 属 性 。• 使 用 +offset 格 式 的 基 址 指 示 符 的 执 行 区 继 承 前 一 个 执 行 区 的 属 性 ( 或 所 在加 载 区 的 属 性 , 如 果 它 是 加 载 区 中 的 第 一 个 执 行 区 ), 或 者 具 有 ABSOLUTE 属性 。• 只 有 根 执 行 区 能 够 使 用 ZEROPAD 属 性 进 行 零 初 始 化 。 如 果 将 ZEROPAD 属 性 用于 非 根 执 行 区 , 则 会 生 成 警 告 并 忽 略 该 属 性 。• 不 能 为 执 行 区 显 式 地 指 定 RELOC 属 性 。 该 区 只 能 从 加 载 区 继 承 RELOC 属 性 。• 使 用 +offset 格 式 的 基 址 指 示 符 的 执 行 区 不 能 具 有 其 自 己 的 属 性 ( 覆 盖 继 承的 ABSOLUTE 属 性 除 外 )。 可 以 使 用 +0 ABSOLUTE 组 合 将 区 设 置 为 ABSOLUTE, 而不 改 变 开 始 位 置 。• 指 定 为 PI 或 OVERLAY( 或 继 承 RELOC 属 性 ) 的 执 行 区 允 许 具 有 重 叠 的 地 址 范围 。 对 于 ABSOLUTE 和 FIXED 执 行 区 , 链 接 器 将 重 叠 的 地 址 范 围 作 为 错 误 处理 。• 缺 省 情 况 下 , 将 启 用 RW 数 据 压 缩 。 通 过 使 用 NOCOMPRESS 关 键 字 , 可 以 指 定不 能 在 最 终 映 像 中 压 缩 执 行 区 。• UNINIT 指 定 不 能 对 执 行 区 中 的 任 何 ZI 输 出 节 进 行 零 初 始 化 。 可 以 使 用 此 关键 字 创 建 一 些 执 行 区 , 其 中 包 含 未 初 始 化 的 数 据 或 内 存 映 射 的 I/O。• 将 为 具 有 OVERLAY 属 性 且 基 址 偏 移 为 +0 的 连 续 执 行 区 指 定 相 同 的 基 址 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-17


使 用 分 散 加 载 描 述 文 件5.2.5 输 入 节 描 述输 入 节 描 述 是 一 种 按 以 下 内 容 标 识 输 入 节 的 模 式 :• 模 块 名 称 ( 目 标 文 件 名 、 库 成 员 名 或 库 文 件 名 )。 模 块 名 称 可 以 使 用 通 配符 。• 输 入 节 名 称 或 输 入 节 属 性 , 如 READ-ONLY 或 CODE。• 符 号 名 。图 5-8 显 示 了 典 型 输 入 节 描 述 组 件 。program2.o (+RO)Input section descriptionModule select patternInput section attribute图 5-8 输 入 节 描 述 组 件BNF 语 法 为 :input_section_description ::=module_select_pattern[ "(" input_section_selector ( "," input_section_selector )* ")" ]input_section_selector ::=其 中 :("+" input_section_attr | input_section_pattern | input_symbol_pattern)module_select_pattern一 个 由 文 字 文 本 构 成 的 模 式 。 通 配 符 * 与 零 个 或 多 个 字 符 相 匹 配 ;? 与 任 何 单 个 字 符 相 匹 配 。匹 配 不 区 分 大 小 写 , 即 使 是 在 区 分 文 件 命 名 大 小 写 的 主 机 上 。可 以 使 用 *.o 匹 配 所 有 对 象 ; 而 使 用 * 匹 配 所 有 目 标 文 件 和 库 。当 module_select_pattern 与 以 下 内 容 之 一 相 匹 配 时 , 输 入 节 将 与 模块 选 择 器 模 式 相 匹 配 :• 包 含 节 的 目 标 文 件 的 名 称 。• 库 成 员 名 称 ( 不 带 前 导 路 径 名 )。5-18 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件• 从 中 提 取 节 的 库 的 完 整 名 称 ( 包 括 路 径 名 )。 如 果 名 称 包 含 空格 , 则 可 以 使 用 通 配 符 简 化 搜 索 。 例 如 , 使 用 *libname.lib 匹配 C:\lib dir\libname.lib。通 过 使 用 特 殊 模 块 选 择 器 模 式 .ANY, 您 可 以 将 输 入 节 分 配 给 执 行区 , 而 无 需 考 虑 其 父 模 块 。 可 以 使 用 .ANY 以 任 意 分 配 方 式 填 充 执行 区 。可 以 使 用 .ANYnum 指 定 特 定 的 优 先 级 顺 序 , 其 中 num 是 一 个 大 于 零 的正 整 数 后 缀 。 使 用 最 大 整 数 指 定 的 优 先 级 最 高 。示 例 5-1 带 有 整 数 后 缀 的 .ANYlr1 0x8000 1024{er1 +0 512{.ANY1(+RO) ; evenly distributed with er3}er2 +0 256{.ANY2(+RO) ; Highest priority, so filled first}er3 +0 256{.ANY1(+RO) ; evenly distributed with er1}}注 意• 执 行 区 中 只 包 含 与 module_select_pattern 和 至 少 一 个input_section_attr 或 input_section_pattern 相 匹 配 的 输 入 节 。如 果 省 略 (+ input_section_attr) 和 (input_section_pattern),则 缺 省 为 +RO。• 不 要 依 赖 编 译 器 生 成 的 输 入 节 名 称 或 由 <strong>ARM</strong> 库 代 码 使 用 的输 入 节 名 称 。 这 些 名 称 可 能 会 因 不 同 的 编 译 而 异 , 例 如 , 使 用不 同 编 译 器 选 项 时 。 另 外 , 不 能 保 证 编 译 器 使 用 的 节 命 名 约定 在 不 同 版 本 之 间 保 持 不 变 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-19


使 用 分 散 加 载 描 述 文 件input_section_attr属 性 选 择 器 与 输 入 节 属 性 相 匹 配 。 每 个 input_section_attr 的 前 面有 一 个 + 号 。如 果 指 定 一 个 模 式 以 匹 配 输 入 节 名 称 , 名 称 前 面 必 须 有 一 个 + 号 。可 以 省 略 紧 靠 + 号 前 面 的 任 何 逗 号 。选 择 器 不 区 分 大 小 写 。 可 以 识 别 以 下 选 择 器 :• RO-CODE• RO-DATA• RO, 同 时 选 择 RO-CODE 和 RO-DATA• RW-DATA• RW-CODE• RW, 同 时 选 择 RW-CODE 和 RW-DATA• ZI• ENTRY, 即 , 包 含 ENTRY 点 的 节 。可 以 识 别 以 下 同 义 词 :• CODE 表 示 RO-CODE• CONST 表 示 RO-DATA• TEXT 表 示 RO• DATA 表 示 RW• BSS 表 示 ZI。可 以 识 别 以 下 伪 属 性 :• FIRST• LAST。以 下 属 性 选 择 器 模 式 描 述 了 执 行 区 中 的 节 位 置 顺 序 :第 一 个 和 最 后 一 个 节如 果 节 位 置 顺 序 很 重 要 ( 例 如 , 如 果 特 定 输 入 节 必 须 是 区中 的 第 一 个 输 入 节 , 而 包 含 校 验 和 的 输 入 节 必 须 是 最 后一 个 输 入 节 ), 则 可 以 使 用 FIRST 和 LAST 标 记 执 行 区 中 的第 一 个 节 和 最 后 一 个 节 。input_section_selector 列 表 中 只 能 有 一 个 FIRST 或 LAST 属性 , 它 必 须 在 单 个 input_section_attr 的 后 面 。 例 如 :*(section, +FIRST)此 模 式 是 正 确 的 。5-20 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件*(+FIRST, section)此 模 式 不 正 确 , 将 生 成 一 条 错 误 消 息 :Error:L6234E: FIRST must follow a single selector。特 殊 模 块 选 择 器通 过 使 用 特 殊 模 块 选 择 器 模 式 .ANY, 您 可 以 将 输 入 节 分配 给 执 行 区 , 而 无 需 考 虑 其 父 模 块 。 可 以 使 用 一 个 或 多个 .ANY 模 式 以 任 意 分 配 方 式 填 充 执 行 区 。 在 大 多 数 情 况下 , 使 用 单 个 .ANY 等 效 于 使 用 * 模 块 选 择 器 。修 改 的 选 择 器分 散 加 载 描 述 文 件 中 不 能 包 含 两 个 * 选 择 器 。 但 是 , 可 以使 用 两 个 修 改 的 选 择 器 ( 如 *A 和 *B), 以 及 将 .ANY 选 择 器与 * 模 块 选 择 器 配 合 使 用 。* 模 块 选 择 器 的 优 先 级 比 .ANY高 。 如 果 删 除 了 文 件 中 包 含 * 选 择 器 的 部 分 ,.ANY 选 择 器将 变 为 活 动 状 态 。未 分 配 的 节在 解 析 所 有 其 他 ( 非 .ANY) 输 入 节 描 述 后 , 才 会 解 析 具 有.ANY 模 块 选 择 器 模 式 的 输 入 节 描 述 。 所 有 未 分 配 给 执 行区 的 节 将 分 配 给 .ANY 区 。如 果 存 在 多 个 .ANY 模 式 , 链 接 器 将 使 用 未 分 配 给 执 行 区的 最 大 节 , 并 将 该 节 分 配 给 具 有 足 够 可 用 空 间 的 最 明 确的 .ANY 执 行 区 。 当 armlink 进 行 此 项 选 择 时 , 它 将.ANY(.text) 视 为 比 .ANY(+RO) 更 明 确 。如 果 几 个 执 行 区 具 有 同 等 的 明 确 性 , 则 将 该 节 分 配 给 可用 剩 余 空 间 最 大 的 执 行 区 。例 如 :• 如 果 两 个 执 行 区 具 有 同 等 的 明 确 性 , 其 中 一 个 执 行区 的 大 小 限 制 为 0x2000, 另 一 个 执 行 区 没 有 限 制 ,则 将 所 有 节 分 配 给 第 二 个 没 有 限 制 的 .ANY 区 。• 如 果 两 个 执 行 区 具 有 同 等 的 明 确 性 , 其 中 一 个 执 行区 的 大 小 限 制 为 0x2000, 另 一 个 执 行 区 的 大 小 限 制为 0x3000, 则 将 要 放 置 的 第 一 批 节 分 配 给 第 二 个 大小 限 制 为 0x3000 的 .ANY 区 , 直 至 第 二 个 .ANY 的 剩 余大 小 减 少 到 0x2000。 此 后 , 将 在 两 个 .ANY 执 行 区 之间 交 替 分 配 节 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-21


使 用 分 散 加 载 描 述 文 件input_section_pattern一 个 与 输 入 节 名 称 相 匹 配 的 模 式 , 不 区 分 大 小 写 。 它 由 文 字 文 本 构成 。 通 配 符 * 与 零 个 或 多 个 字 符 相 匹 配 ;? 与 任 何 单 个 字 符 相 匹配 。注 意如 果 使 用 多 个 input_section_pattern, 请 确 保 不 同 执 行 区 中 没 有 重复 的 模 式 , 以 避 免 出 现 歧 义 错 误 。input_symbol_pattern可 以 按 输 入 节 定 义 的 全 局 符 号 名 称 来 选 择 该 节 。 这 样 , 即 可 从 部 分链 接 的 对 象 中 选 择 具 有 相 同 名 称 的 各 个 节 。:gdef: 前 缀 可 以 区 分 全 局 符 号 模 式 和 节 模 式 。 例 如 , 可 以 使 用:gdef:mysym 选 择 定 义 mysym 的 节 。 以 下 示 例 说 明 了 一 个 描 述 文 件 ,其 中 的 ExecReg1 包 含 一 个 定 义 全 局 符 号 mysym1 的 节 以 及 一 个 包 含 全局 符 号 mysym2 的 节 :LoadRegion 0x8000{ExecReg1 +0{*(:gdef:mysym1)*(:gdef:mysym2)}; rest of scatter description}注 意如 果 使 用 多 个 input_symbol_pattern, 请 确 保 不 同 执 行 区 中 没 有 重 复的 模 式 , 以 避 免 出 现 歧 义 错 误 。输 入 节 描 述 符 的 顺 序 并 不 重 要 。5-22 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件5.2.6 解 析 多 个 匹 配如 果 某 个 节 与 多 个 执 行 区 相 匹 配 , 则 按 下 述 方 式 解 析 匹 配 。 但 是 , 如 果 找 不 到 唯一 匹 配 , 则 链 接 器 将 分 散 加 载 描 述 作 为 错 误 处 理 。 每 个 节 是 通 过module_select_pattern 和 input_section_selector 选 择 的 。module_select_pattern 规 范 示 例 如 下 :• * 与 任 何 模 块 或 库 相 匹 配• *.o 与 任 何 对 象 模 块 相 匹 配• math.o 与 math.o 模 块 相 匹 配• *armlib* 与 <strong>ARM</strong> 提 供 的 所 有 C 库 相 匹 配• *math.lib 与 以 math.lib 结 尾 的 任 何 库 路 径 相 匹 配 。 例 如 ,C:\apps\lib\math\satmath.lib。input_section_selector 规 范 示 例 如 下 :• +RO 是 与 所 有 RO 代 码 和 所 有 RO 数 据 相 匹 配 的 输 入 节 属 性• +RW,+ZI 是 与 所 有 RW 代 码 、 所 有 RW 数 据 和 所 有 ZI 数 据 相 匹 配 的 输 入 节 属性• BLOCK_42 是 与 名 为 BLOCK_42 的 汇 编 文 件 区 域 相 匹 配 的 输 入 节 模 式 。注 意编 译 器 生 成 可 由 输 入 节 模 式 标 识 的 区 域 , 例 如 .text、.data、.constdata 和.bss。 但 是 , 这 些 名 称 将 来 可 能 会 发 生 改 变 , 您 必 须 避 免 使 用 这 些 名 称 。如 果 要 匹 配 C 或 C++ 文 件 中 的 特 定 函 数 或 extern 数 据 , 请 执 行 以 下 任 一 操作 :— 在 单 独 模 块 中 编 译 该 函 数 或 数 据 , 然 后 匹 配 模 块 对 象 名— 使 用 #pragma arm section 或 __attribute__ 指 定 包 含 所 需 代 码 或 数 据 的节 的 名 称 。 有 关 编 译 指 示 的 详 细 信 息 , 请 参 阅 《 编 译 器 参 考 指 南 》 中的 第 4-49 页 的 编 译 指 示 。以 下 变 量 用 于 描 述 多 个 匹 配 :• m1 和 m2 表 示 模 块 选 择 器 模 式• s1 和 s2 表 示 输 入 节 选 择 器 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-23


使 用 分 散 加 载 描 述 文 件如 果 出 现 多 个 匹 配 , 链 接 器 将 根 据 最 明 确 的 module_select_pattern 和input_section_selector 对 来 确 定 将 输 入 节 分 配 到 的 区 。例 如 , 如 果 输 入 节 A 匹 配 执 行 区 R1 的 m1,s1, 并 且 A 还 匹 配 执 行 区 R2 的m2,s2, 则 链 接 器 :• 将 A 分 配 给 R1( 如 果 m1,s1 比 m2,s2 更 明 确 )• 将 A 分 配 给 R2( 如 果 m2,s2 比 m1,s1 更 明 确 )• 诊 断 分 散 加 载 描 述 出 错 ( 如 果 m1,s1 不 比 m2,s2 更 明 确 ,m2,s2 也 不 比 m1,s1更 明 确 )。armlink 按 以 下 顺 序 确 定 最 明 确 的 module_select_pattern 和 input_section_selector对 :1. 对 于 模 块 选 择 器 模 式 :如 果 文 本 字 符 串 m1 与 模 式 m2 相 匹 配 , 而 文 本 字 符 串 m2 与 模 式 m1 不 匹配 , 则 m1 比 m2 更 明 确 。2. 对 于 输 入 节 选 择 器 :• 如 果 s1 和 s2 都 是 与 节 名 称 相 匹 配 的 模 式 , 则 使 用 与 模 块 选 择 器 模 式相 同 的 定 义 。• 如 果 s1 和 s2 中 的 一 个 与 输 入 节 名 称 相 匹 配 , 另 一 个 与 输 入 节 属 性 相匹 配 , 则 s1 和 s2 的 顺 序 出 现 混 乱 并 将 描 述 诊 断 为 出 错 。• 如 果 s1 和 s2 都 与 输 入 节 属 性 相 匹 配 ,s1 是 否 比 s2 更 明 确 是 由 以 下 关系 定 义 的 :— ENTRY 比 RO-CODE、RO-DATA、RW-CODE 或 RW-DATA 更 明 确— RO-CODE 比 RO 更 明 确— RO-DATA 比 RO 更 明 确— RW-CODE 比 RW 更 明 确— RW-DATA 比 RW 更 明 确— 节 属 性 之 间 没 有 其 他 的 关 系 (s1 比 s2 更 明 确 ) 成 员 。3. 对 于 module_select_pattern, input_section_selector 对 , 仅 当 任 何 以 下 条 件成 立 时 ,m1,s1 才 比 m2,s2 更 明 确 :• s1 是 文 字 输 入 节 名 称 ( 即 , 它 不 包 含 模 式 字 符 ), 并 且 s2 与 +ENTRY 之外 的 输 入 节 属 性 相 匹 配• m1 比 m2 更 明 确• s1 比 s2 更 明 确 。5-24 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件这 种 匹 配 策 略 产 生 以 下 结 果 :• 描 述 不 依 赖 于 它 们 在 文 件 中 的 写 入 顺 序 。• 一 般 来 说 , 对 象 的 描 述 越 明 确 , 它 包 含 的 输 入 节 的 描 述 也 就 越 明 确 。• 不 检 查 input_section_selector, 除 非 :— 对 象 选 择 不 确 定 。— 一 个 选 择 器 完 全 命 名 输 入 节 , 另 一 个 选 择 器 按 属 性 进 行 选 择 。 在 这 种情 况 下 , 显 式 地 输 入 节 名 称 比 ENTRY( 可 精 确 地 从 一 个 对 象 中 选 择 一个 输 入 节 ) 之 外 的 任 何 属 性 更 明 确 。 即 使 与 输 入 节 名 称 关 联 的 对 象 选择 器 不 如 属 性 的 对 象 选 择 器 明 确 , 上 述 结 论 也 成 立 。示 例 5-2 说 明 了 多 个 执 行 区 和 模 式 匹 配 。示 例 5-2 多 个 执 行 区 和 模 式 匹 配LR_1 0x040000{ER_ROM 0x040000; The startup exec region address is the same{ ; as the load address.application.o (+ENTRY) ; The section containing the entry point from} ; the object is placed here.ER_RAM1 0x048000{application.o (+RO-CODE) ; Other RO code from the object goes here}ER_RAM2 0x050000{application.o (+RO-DATA) ; The RO data goes here}ER_RAM3 0x060000{application.o (+RW) ; RW code and data go here}ER_RAM4 +0; Follows on from end of ER_R3{*.o (+RO, +RW, +ZI) ; Everything except for application.o goeshere}}<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-25


使 用 分 散 加 载 描 述 文 件5.2.7 解 析 路 径 名链 接 器 将 分 散 加 载 文 件 中 的 通 配 符 模 式 与 它 在 路 径 名 中 找 到 的 任 何 正 斜 杠 和 反斜 杠 组 合 进 行 匹 配 。 如 果 路 径 是 从 环 境 变 量 或 多 个 来 源 中 提 取 的 , 或 者 要 使 用相 同 的 分 散 加 载 文 件 在 Windows 或 Unix 平 台 上 进 行 构 建 , 这 可 能 是 非 常 有 用的 。注 意<strong>ARM</strong> 建 议 在 路 径 名 中 使 用 正 斜 杠 , 以 确 保 在 Windows 和 Unix 平 台 上 能 够 识 别它 们 。5.2.8 分 散 加 载 文 件 中 的 表 达 式 求 值分 散 加 载 文 件 通 常 包 含 指 定 为 表 达 式 的 数 值 常 数 。 链 接 器 还 提 供 一 个 名 为ScatterAssert 的 断 言 函 数 , 该 函 数 将 表 达 式 作 为 参 数 。 如 果 此 表 达 式 的 计 算 结 果不 是 true, 则 会 生 成 一 条 错 误 消 息 。 有 关 详 细 信 息 , 请 参 阅 第 5-27 页 的ScatterAssert 函 数 。表 达 式 用 法可 以 将 表 达 式 用 于 以 下 位 置 :• 加 载 和 执 行 区 base_address• 加 载 和 执 行 区 +offset• 加 载 和 执 行 区 max_size• ALIGN、FILL 或 PADVALUE 关 键 字 的 参 数• ScatterAssert 函 数 的 参 数 。表 达 式 规 则表 达 式 遵 循 C 优 先 级 规 则 并 由 以 下 内 容 组 成 :• 十 进 制 或 十 六 进 制 数 字 。• 算 术 运 算 符 :+、-、/、*、~、OR 和 ANDOR 和 AND 运 算 符 分 别 映 射 到 C 运 算 符 | 和 &。• 逻 辑 运 算 符 :LOR、LAND 和 !LOR 和 LAND 运 算 符 分 别 映 射 到 C 运 算 符 || 和 &&。• 关 系 运 算 符 := 和 ==5-26 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件如 果 表 达 式 的 计 算 结 果 为 false, 则 返 回 零 ; 如 果 计 算 结 果 为 true, 则 返 回非 零 值 。• 条 件 运 算 符 :Expression ? Expression1 : Expression2它 与 C 条 件 运 算 符 相 匹 配 。 如 果 Expression 的 计 算 结 果 不 为 零 , 则 对Expression1 进 行 求 值 , 否 则 , 对 Expression2 进 行 求 值 。• 返 回 数 字 的 函 数 。 有 关 详 细 信 息 , 请 参 阅 内 置 函 数 。所 有 运 算 符 在 含 义 和 优 先 级 方 面 与 对 应 的 C 运 算 符 完 全 一 致 。表 达 式 不 区 分 大 小 写 , 为 了 清 晰 起 见 , 表 达 式 可 以 使 用 括 号 。内 置 函 数仅 当 指 定 了 base_address 或 +offset 值 时 , 才 能 使 用 与 执 行 地 址 有 关 的 函 数 。 它们 映 射 到 表 5-2 中 所 示 的 链 接 器 定 义 的 符 号 组 合 。表 5-2 与 执 行 地 址 有 关 的 函 数函 数ImageBase(region_name)链 接 器 定 义 的 符 号 值Image$$region_name$$BaseImageLength(region_name) Image$$region_name$$Length +Image$$region_name$$ZI$$LengthImageLimit(region_name) Image$$region_name$$Base +Image$$region_name$$Length +Image$$region_name$$ZI$$Length有 关 与 区 有 关 的 链 接 器 符 号 的 详 细 信 息 , 请 参 阅 第 4-3 页 的 表 4-1。region_name 参 数 可 以 是 加 载 区 或 执 行 区 名 称 。 不 允 许 进 行 正 向 引 用 。region_name 只 能 引 用 第 5-28 页 的 已 定 义 的 加 载 区 或 执 行 区 。ScatterAssert 函 数可 以 在 顶 层 或 加 载 区 内 使 用 ScatterAssert(expression) 函 数 。 在 链 接 完 成 后 , 将对 其 进 行 求 值 , 如 果 expression 的 计 算 结 果 为 false, 则 会 生 成 一 条 错 误 消 息 。第 5-30 页 的 示 例 5-7 说 明 了 如 何 使 用 ScatterAssert 函 数 写 入 超 过 区 的 max_size所 允 许 数 量 的 复 杂 大 小 检 查 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-27


使 用 分 散 加 载 描 述 文 件与 加 载 地 址 有 关 的 函 数 只 能 在 ScatterAssert 函 数 内 部 使 用 。 它 们 映 射 到 表 5-3 中所 示 的 三 个 链 接 器 定 义 的 符 号 值 。表 5-3 与 加 载 地 址 有 关 的 函 数函 数LoadBase(region_name)LoadLength(region_name)LoadLimit(region_name)链 接 器 定 义 的 符 号 值Load$$region_name$$BaseLoad$$region_name$$LengthLoad$$region_name$$Limitregion_name 参 数 可 以 是 加 载 区 或 执 行 区 名 称 。 不 允 许 进 行 正 向 引 用 。 region_name只 能 引 用 已 定 义 的 加 载 区 或 执 行 区 。与 符 号 有 关 的 函 数如 果 未 定 义 global_symbol_name, 则 与 符 号 有 关 的 函 数defined(global_symbol_name) 返 回 零 ; 否 则 , 返 回 非 零 值 。示 例示 例 5-3 根 据 表 达 式 指 定 最 大 大 小LR1 0x8000 (2 * 1024){ER1 +0 (1 * 1024){*(+RO)}ER2 +0 (1 * 1024){*(+RW +ZI)}}示 例 5-4 将 一 个 执 行 区 放 在 另 一 个 执 行 区 后 面LR1 0x8000{ER1 0x100000{5-28 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件*+RO}}LR2 0x100000{ER2 (ImageLimit(ER1)){*(+RW +ZI)}}; Place ER2 after ER1 has finished示 例 5-5 将 基 于 符 号 是 否 存 在 的 基 址 作 为 条 件LR1 0x8000{ER1 (defined(version1) ? 0x8000 : 0x10000)}{*(+RO)}ER2 +0{*(+RW +ZI)}; Base address is 0x8000; if version1 is defined; 0x10000 if not示 例 5-6 中 使 用 预 处 理 器 宏 和 表 达 式 组 合 , 将 紧 密 压 缩 的 执 行 区 复 制 到 页 面 边 界上 的 执 行 地 址 。 通 过 使 用 ALIGN 分 散 加 载 关 键 字 , 可 以 将 ER2 和 ER3 的 加 载 地 址 以及 执 行 地 址 对 齐 。示 例 5-6 在 执 行 空 间 中 对 齐 基 址 , 但 在 加 载 空 间 中 仍 紧 密 压 缩#! armcc -E#DEFINE START_ADDRESS 0x100000#DEFINE PAGE_ALIGNMENT 0x100000#DEFINE MY_ALIGN(address, alignment) ((address +(alignment-1)) AND ~(alignment-1))LR1 0x8000{ER0 +0{<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-29


使 用 分 散 加 载 描 述 文 件}*(InRoot$$Sections)}ER1 START_ADDRESS{file1.o(*)}ER2 MY_ALIGN(ImageLimit(ER1), PAGE_ALIGNMENT){file2.o(*)}ER3 MY_ALIGN(ImageLimit(ER2), PAGE_ALIGNMENT){file3.o(*)}示 例 5-7 使 用 ScatterAssert 检 查 多 个 区 的 大 小LR1 0x8000{ER0 +0{*(+RO)}ER1 +0{file1.o(+RW)}ER2 +0{file2.o(+RW)}ScatterAssert((LoadLength(ER1) + LoadLength(ER2)) < 0x1000); LoadLength is compressed sizeScatterAssert((ImageLength(ER1) + ImageLength(ER2)) < 0x2000); ImageLength is uncompressed size}ScatterAssert(ImageLength(LR1) < 0x3000) ; Check uncompressed size ofLoadRegion5-30 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件5.3 指 定 区 和 节 地 址 的 示 例本 节 介 绍 了 输 入 和 执 行 节 、 区 和 预 处 理 指 令 。 有 关 访 问 位 于 固 定 地 址 中 的 数 据和 函 数 的 示 例 , 请 参 阅 《 开 发 指 南 》 中 的 第 2 章 嵌 入 式 软 件 开 发 。5.3.1 在 分 散 加 载 描 述 中 选 择 胶 合 代 码 输 入 节胶 合 代 码 用 于 在 <strong>ARM</strong> 和 Thumb 代 码 之 间 切 换 , 或 者 执 行 比 一 条 指 令 中 指 定 的跳 转 范 围 更 大 的 程 序 跳 转 。 请 参 阅 第 3-18 页 的 胶 合 代 码 生 成 。 可 以 使 用 分 散 加载 描 述 文 件 来 放 置 链 接 器 生 成 的 胶 合 代 码 输 入 节 。 分 散 加 载 描 述 文 件 中 的 一 个执 行 区 最 多 可 以 包 含 *(Veneer$$Code) 节 选 择 器 。如 果 此 操 作 是 安 全 的 , 链 接 器 则 会 将 胶 合 代 码 输 入 节 放 到 *(Veneer$$Code) 节 选择 器 识 别 的 区 中 。 由 于 地 址 范 围 问 题 或 执 行 区 大 小 限 制 , 可 能 无 法 将 胶 合 代 码输 入 节 分 配 到 区 中 。 如 果 不 能 将 胶 合 代 码 添 加 到 指 定 的 区 中 , 则 会 将 它 添 加 到包 含 生 成 胶 合 代 码 的 重 定 位 输 入 节 的 执 行 区 中 。注 意在 以 前 版 本 的 <strong>ARM</strong> 工 具 中 , 分 散 加 载 描 述 文 件 中 的 *(IWV$$Code) 实 例 自 动 转 换为 *(Veneer$$Code)。 应 在 新 描 述 中 使 用 *(Veneer$$Code)。如 果 执 行 区 中 的 代 码 数 量 超 过 以 下 数 量 , 则 会 忽 略 *(Veneer$$Code):Thumb 代 码4Mb、Thumb-2 代 码 16Mb 以 及 <strong>ARM</strong> 代 码 32Mb。5.3.2 创 建 根 执 行 区如 果 指 定 了 映 像 的 初 始 入 口 点 , 或 者 由 于 仅 使 用 一 个 ENTRY 指 令 而 使 链 接 器 创 建初 始 入 口 点 , 则 必 须 确 保 入 口 点 位 于 根 区 中 。 根 区 是 指 加 载 地 址 和 执 行 地 址 相同 的 区 。 如 果 初 始 入 口 点 不 在 根 区 中 , 链 接 将 会 失 败 , 并 且 链 接 器 生 成 一 条 错 误消 息 , 例 如 :Entry point (0x00000000) lies within non root region ER_ROM要 在 分 散 加 载 描 述 文 件 中 将 区 指 定 为 根 区 , 您 可 以 执 行 以 下 任 一 操 作 :• 显 式 地 将 ABSOLUTE 指 定 为 执 行 区 属 性 ( 或 将 其 作 为 缺 省 设 置 ), 并 且 第 一 个执 行 区 及 其 所 在 的 加 载 区 使 用 相 同 的 地 址 。 要 使 执 行 区 地 址 与 加 载 区 地 址相 同 , 请 执 行 以 下 任 一 操 作 :— 为 执 行 区 基 址 和 加 载 区 基 址 指 定 相 同 的 数 值— 为 加 载 区 中 的 第 一 个 执 行 区 指 定 +0 偏 移 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-31


使 用 分 散 加 载 描 述 文 件如 果 为 加 载 区 中 的 所 有 后 续 执 行 区 指 定 0 偏 移 (+0), 则 它 们 均 为 根区 。请 参 阅 示 例 5-8。• 使 用 FIXED 执 行 区 属 性 以 确 保 特 定 区 的 加 载 地 址 和 执 行 地 址 是 相 同 的 。 请参 阅 示 例 5-9 和 第 5-33 页 的 图 5-9。可 以 使 用 FIXED 属 性 将 任 何 执 行 区 放 在 ROM 中 的 特 定 地 址 。 有 关 详 细 信 息 , 请参 阅 第 5-33 页 的 将 区 放 在 固 定 地 址 中 。示 例 5-8 指 定 相 同 的 加 载 和 执 行 地 址LR_1 0x040000; load region starts at 0x40000{ ; start of execution region descriptionsER_RO 0x040000 ; load address = execution address{* (+RO) ; all RO sections (must include section with; initial entry point)}... ; rest of scatter description}示 例 5-9 使 用 FIXED 属 性LR_1 0x040000; load region starts at 0x40000{ ; start of execution region descriptionsER_RO 0x040000; load address = execution address{* (+RO) ; RO sections other than those in init.o}ER_INIT 0x080000 FIXED ; load address and execution address of this; execution region are fixed at 0x80000{init.o(+RO); all RO sections from init.o}... ; rest of scatter description}5-32 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件Filled with zeroes or the value defined using the --pad optionSingleloadregioninit.oEmpty0x80000init.o(FIXED)(movable)*(RO)0x4000*(RO)Load viewExecution view图 5-9 固 定 执 行 区 的 内 存 映 射5.3.3 将 区 放 在 固 定 地 址 中可 以 在 执 行 区 分 散 加 载 描 述 文 件 中 使 用 FIXED 属 性 来 创 建 根 区 , 将 在 固 定 地 址 加载 和 执 行 这 些 区 。FIXED 用 于 在 单 个 加 载 区 内 ( 因 而 通 常 为 单 个 ROM 设 备 ) 创 建 多 个 根 区 。 例 如 ,可 以 使 用 此 属 性 将 函 数 或 数 据 块 ( 如 常 数 表 或 校 验 和 ) 放 到 ROM 中 的 固 定 地址 , 以 便 可 以 通 过 指 针 方 便 地 对 其 进 行 访 问 。例 如 , 如 果 指 定 将 某 些 初 始 化 代 码 放 在 ROM 开 头 , 而 将 校 验 和 放 在 ROM 末 尾 ,则 可 能 不 会 使 用 某 些 内 存 内 容 。 应 使 用 * 或 .ANY 模 块 选 择 器 填 充 初 始 化 块 末 尾和 数 据 块 开 头 之 间 的 区 。注 意要 使 代 码 更 易 于 维 护 和 调 试 , 请 在 分 散 加 载 描 述 文 件 中 使 用 最 少 数 量 的 位 置 说明 , 而 由 链 接 器 提 供 函 数 和 数 据 的 详 细 位 置 信 息 。无 法 指 定 已 部 分 链 接 的 组 件 对 象 。 例 如 , 如 果 部 分 链 接 obj1.o、obj2.o 和 obj3.o对 象 以 生 成 obj_all.o, 则 会 在 结 果 对 象 中 弃 用 结 果 组 件 对 象 的 名 称 。 因 此 , 不 能按 名 称 引 用 其 中 的 某 个 对 象 , 例 如 obj1.o。 只 能 引 用 合 并 的 对 象 obj_all.o。将 函 数 和 数 据 放 在 特 定 地 址 中通 常 , 编 译 器 通 过 单 个 源 文 件 生 成 RO、RW 和 ZI 节 。 这 些 区 包 含 源 文 件 中 的 所有 代 码 和 数 据 。 要 将 单 个 函 数 或 数 据 项 放 在 固 定 地 址 中 , 您 必 须 允 许 链 接 器 单独 处 理 该 函 数 或 数 据 , 而 与 输 入 文 件 的 其 余 部 分 分 开 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-33


使 用 分 散 加 载 描 述 文 件链 接 器 可 以 使 用 两 种 方 法 , 将 某 个 节 放 在 特 定 地 址 中 :• 可 以 使 用 以 下 节 描 述 在 所 需 地 址 中 创 建 执 行 区 : 仅 选 择 一 个 节 。• 对 于 特 别 命 名 的 节 , 链 接 器 可 以 从 节 名 称 中 获 取 放 置 地 址 。 这 些 特 别 命 名的 节 称 为 __at 节 。 有 关 详 细 信 息 , 请 参 阅 第 5-36 页 的 使 用 __at 节 将 节 放 在特 定 地 址 中 。要 将 函 数 或 变 量 放 在 特 定 地 址 中 , 必 须 将 其 放 在 自 己 的 节 中 。 可 以 使 用 几 种 方法 来 执 行 此 操 作 :• 将 函 数 或 数 据 项 放 在 其 自 己 的 源 文 件 中 。• 可 以 使 用 --split_sections 编 译 器 选 项 为 每 个 函 数 生 成 目 标 文 件 。 请 参 阅《 编 译 器 参 考 指 南 》 中 的 第 2-83 页 的 --split_sections。对 于 一 些 函 数 , 此 选 项 将 稍 微 增 大 代 码 的 尺 寸 , 因 为 它 减 少 了 函 数 之 间 共享 地 址 、 数 据 和 字 符 串 文 字 的 可 能 性 。 但 是 , 通 过 指 定 armlink --remove 以允 许 链 接 器 删 除 未 使 用 的 函 数 , 可 有 助 于 减 小 最 终 映 像 的 总 体 大 小 。• 可 以 使 用 __attribute__((section(înameî))) 创 建 多 个 已 命 名 的 节 。 请 参 阅《 编 译 器 参 考 指 南 》 中 的 第 4-44 页 的 __attribute__((section))。• 使 用 汇 编 语 言 中 的 AREA 指 令 。 在 汇 编 代 码 中 , 最 小 的 可 定 位 单 元 是 AREA。有 关 详 细 信 息 , 请 参 阅 《 汇 编 程 序 指 南 》。显 式 地 使 用 分 散 加 载 放 置 已 命 名 的 节示 例 5-10 中 的 分 散 加 载 描 述 文 件 将 :• 初 始 化 代 码 放 在 地 址 0x0 中 , 其 后 是 其 余 RO 代 码 和 除 data.o 对 象 中 的 RO数 据 之 外 的 所 有 RO 数 据• 所 有 全 局 RW 变 量 放 在 RAM 的 0x400000 中• data.o 的 RO-DATA 表 放 在 固 定 地 址 0x1FF00 中 。示 例 5-10 节 放 置LR1 0x0 0x10000{ER1 0x0 0x2000; Root Region, containing init code{ ; place init code at exactly 0x0init.o (Init, +FIRST)* (+RO) ; rest of code and read-only data}5-34 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件}RAM 0x400000; RW & ZI data to be placed at 0x400000{* (+RW +ZI)}DATABLOCK 0x1FF00 FIXED 0xFF ; execution region fixed at 0x1FF00{ ; maximum space available for table is 0xFFdata.o(+RO-DATA); place RO data between 0x1FF00 and 0x1FFFF}注 意在 某 些 情 况 下 , 不 适 合 将 FIXED 和 单 个 加 载 区 配 合 使 用 。 下 面 是 其 他 一 些 指 定 固定 位 置 的 方 法 :• 如 果 加 载 程 序 可 以 处 理 多 个 加 载 区 , 请 将 RO 代 码 或 数 据 放 在 其 自 己 的 加载 区 中 。• 如 果 不 需 要 将 函 数 或 数 据 放 在 ROM 中 的 固 定 位 置 , 请 使 用 ABSOLUTE 而 不是 FIXED。 加 载 程 序 随 后 会 将 数 据 从 加 载 区 复 制 到 RAM 中 的 指 定 地 址 。ABSOLUTE 是 缺 省 属 性 。• 要 将 数 据 结 构 放 在 内 存 映 射 的 I/O 位 置 , 请 使 用 两 个 加 载 区 并 指 定 UNINIT。UNINIT 可 确 保 不 会 将 内 存 位 置 初 始 化 为 零 。 有 关 详 细 信 息 , 请 参 阅 《 开 发指 南 》 中 的 第 2 章 嵌 入 式 软 件 开 发 。使 用 __attribute__((section("name")))标 准 编 码 方 法 是 , 将 代 码 或 数 据 对 象 放 在 其 自 己 的 源 文 件 中 , 然 后 放 置 目 标 文 件节 。 但 是 , 也 可 以 使 用 __attribute__((section("name"))) 和 分 散 加 载 描 述 文 件 来放 置 已 命 名 的 节 。 应 创 建 一 个 模 块 ( 如 adder.c) 并 显 式 地 命 名 节 , 如 示 例 5-11中 所 示 。示 例 5-11 命 名 节int variable __attribute__((section("foo"))) = 10;可 以 使 用 分 散 加 载 描 述 文 件 指 定 已 命 名 的 节 的 放 置 位 置 , 请 参 阅 示 例 5-12。 如果 代 码 和 数 据 节 的 名 称 相 同 , 则 先 放 置 代 码 节 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-35


使 用 分 散 加 载 描 述 文 件示 例 5-12 放 置 节FLASH 0x24000000 0x4000000{... ; rest of code}ADDER 0x08000000{adder.o (foo)}; select section foo from adder.o使 用 __at 节 将 节 放 在 特 定 地 址 中可 以 为 节 指 定 一 个 特 殊 名 称 , 以 编 码 必 须 将 其 放 置 到 的 地 址 。 您 可 以 按 以 下 方式 指 定 名 称 :.<strong>ARM</strong>.__at_address其 中 :address是 所 需 的 节 地 址 。 可 以 按 十 六 进 制 或 十 进 制 指 定 此 地 址 。 采 用.<strong>ARM</strong>.__at_address 格 式 的 节 是 由 缩 写 __at 引 用 的 。在 编 译 器 中 , 通 过 使 用 属 性 section() 显 式 地 命 名 __at 节 , 或 者 使 用 属 性 __at 设置 节 名 称 , 可 以 将 变 量 分 配 给 这 些 节 。 例 如 , 以 下 语 句 将 变 量 放 在 名 为.<strong>ARM</strong>.__at_0x8000 的 节 中 :int variable __attribute__((section(".<strong>ARM</strong>.__at_0x8000"))) = 10;int variable __attribute__((__at(0x8000))) = 10;请 参 阅 《 编 译 器 参 考 指 南 》 中 的 第 4-40 页 的 变 量 属 性 。限 制• __at 节 地 址 范 围 不 能 重 叠 , 除 非 将 重 叠 节 放 在 不 同 的 重 叠 区 中• 不 允 许 在 与 位 置 无 关 的 执 行 区 中 使 用 __at 节• 不 能 引 用 __at 节 的 链 接 器 定 义 的 符 号 $$Base、$$Limit 和 $$Length• 不 能 在 System V 和 BPABI 可 执 行 文 件 和 BPABI DLL 中 使 用 __at 节• __at 节 地 址 必 须 是 其 对 齐 边 界 的 倍 数• __at 节 忽 略 任 何 +FIRST 或 +LAST 排 序 约 束 。5-36 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件手 动 放 置可 以 使 用 标 准 分 散 加 载 规 则 来 确 定 用 于 放 置 __at 节 的 执 行 区 。示 例 5-13 说 明 了 只 读 节 .<strong>ARM</strong>.__at_0x2000 和 读 写 节 .<strong>ARM</strong>.__at_0x4000 的 放 置 方式 。 在 手 动 模 式 下 , 不 会 自 动 创 建 加 载 区 和 执 行 区 。 如 果 不 能 将 __at 节 放 在 执行 区 中 , 则 会 产 生 错 误 。示 例 5-13 在 分 散 加 载 文 件 中 手 动 放 置 __at 节LR1 0x0{ER_RO 0x0 0x2000{*(+RO)}ER_RO2 0x2000{*(.<strong>ARM</strong>.__at_0x2000)}ER2 0x4000{*(+RW +ZI)}}; .<strong>ARM</strong>.__at_0x0 is selected by +RO; .<strong>ARM</strong>.__at_0x2000 is selected by .<strong>ARM</strong>.__at_0x2000; .<strong>ARM</strong>.__at_0x4000 is selected by +RW自 动 放 置此 模 式 是 使 用 链 接 器 命 令 行 选 项 --autoat 启 用 的 。 有 关 详 细 信 息 , 请 参 阅第 2-11 页 的 为 映 像 指 定 内 存 映 射 信 息 。使 用 --autoat 选 项 进 行 链 接 时 , 分 散 加 载 选 择 器 不 会 放 置 __at 节 。 相 反 , 链 接 器将 __at 节 放 在 兼 容 区 中 。 如 果 找 不 到 兼 容 区 , 链 接 器 将 为 __at 节 创 建 加 载 和 执行 区 。链 接 器 使 用 --autoat 创 建 的 所 有 执 行 区 均 具 有 UNINIT 分 散 加 载 属 性 。 如 果 需 要对 ZI __at 节 进 行 零 初 始 化 , 则 必 须 将 其 放 在 兼 容 区 中 。兼 容 区 是 指 :• __at 地 址 位 于 执 行 区 基 址 和 限 制 范 围 内 , 其 中 限 制 是 指 基 址 + 最 大 执 行 区大 小 。 如 果 未 设 置 最 大 大 小 , 则 假 定 限 制 为 无 限 大 的 值 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-37


使 用 分 散 加 载 描 述 文 件• 加 载 区 至 少 满 足 以 下 条 件 之 一 :— 它 包 含 一 个 按 标 准 分 散 加 载 规 则 与 __at 节 相 匹 配 的 选 择 器— 它 至 少 具 有 一 个 类 型 与 __at 节 相 同 的 节 (RO、RW 或 ZI)— 它 没 有 EMPTY 属 性 。注 意链 接 器 将 类 型 为 RW 的 __at 节 视 为 与 RO 兼 容 。第 5-38 页 的 示 例 5-14 说 明 了 具 有 如 下 类 型 的 节 :.<strong>ARM</strong>.__at_0x0 RO、.<strong>ARM</strong>.__at_0x2000 RW、.<strong>ARM</strong>.__at_0x4000 ZI 和 .<strong>ARM</strong>.__at_0x8000 ZI。示 例 5-14 自 动 放 置 __at 节LR1 0x0{ER_RO 0x0 0x2000{*(+RO) ; .<strong>ARM</strong>.__at_0x0 lies within the bounds of ER_RO}ER_RW 0x2000 0x2000{*(+RW) ; .<strong>ARM</strong>.__at_0x2000 lies within the bounds of ER_RW}ER_ZI 0x4000 0x2000{*(+ZI) ; .<strong>ARM</strong>.__at_0x4000 lies within the bounds of ER_ZI}}; the linker creates a load and execution region for the __at section; .<strong>ARM</strong>.__at_0x8000 because it lies outside all candidate regions.将 键 放 在 闪 存 中某 些 闪 存 设 备 需 要 将 键 写 入 到 地 址 中 以 激 活 某 些 功 能 。 __at 节 提 供 了 一 种 简 单方 法 , 将 值 写 入 到 特 定 地 址 中 。假 定 设 备 的 闪 存 范 围 从 0x8000 到 0x10000, 并 且 需 要 将 键 放 在 地 址 0x9000 中 。 要使 用 __at 节 执 行 此 操 作 , 您 必 须 定 义 一 个 包 含 键 值 的 .<strong>ARM</strong>.__at_0x9000 节 。 例如 :int key __attribute__((__at(0x9000))) = 10;5-38 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件示 例 5-15 说 明 了 一 个 手 动 放 置 闪 存 执 行 区 的 分 散 加 载 文 件 。示 例 5-15 手 动 放 置 闪 存 执 行 区ER_FLASH 0x8000 0x2000{*(+RO)reqd*(.<strong>ARM</strong>.__at_0x9000)}; other code, read-only data, and padding if; key第 5-39 页 的 示 例 5-16 说 明 了 一 个 自 动 放 置 闪 存 执 行 区 的 分 散 加 载 文 件 。 可 以 使用 链 接 器 命 令 行 选 项 --autoat 来 启 用 自 动 放 置 。示 例 5-16 自 动 放 置 闪 存 执 行 区ER_FLASH 0x8000 0x2000{*(+RO)}; other code and read-only data, the; __at section is automatically selected将 结 构 映 射 到 外 围 寄 存 器 上要 将 未 初 始 化 的 变 量 放 在 外 围 寄 存 器 上 , 您 可 以 使 用 ZI __at 节 。 假 定 可 以 在0x10000000 中 使 用 某 个 寄 存 器 。 应 定 义 一 个 名 为 .<strong>ARM</strong>.__at_0x10000000 的 ZI __at节 。示 例 5-17 说 明 了 一 个 手 动 放 置 ZI __at 节 的 分 散 加 载 文 件 。示 例 5-17 手 动 放 置 ZI __at 节ER_PERIPHERAL 0x10000000 UNINIT{*(.<strong>ARM</strong>.__at_10000000)}使 用 自 动 放 置 时 , 假 定 0x10000000 附 近 没 有 其 他 执 行 区 , 链 接 器 将 在 0x10000000处 自 动 创 建 一 个 包 含 UNINIT 属 性 的 区 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-39


使 用 分 散 加 载 描 述 文 件5.3.4 使 用 重 叠 区 放 置 节可 以 在 分 散 加 载 描 述 文 件 中 使 用 OVERLAY 属 性 将 多 个 执 行 区 放 在 相 同 地 址 中 。 示例 5-18 在 RAM 中 定 义 一 个 静 态 节 , 后 面 是 一 系 列 重 叠 区 。 此 处 , 只 能 在 运 行 时实 例 化 其 中 的 一 个 节 。示 例 5-18 指 定 根 区EMB_APP 0x8000{..STATIC_RAM 0x0; contains most of the RW and ZI code/data{* (+RW,+ZI)}OVERLAY_A_RAM 0x1000 OVERLAY ; start address of overlay...{module1.o (+RW,+ZI)}OVERLAY_B_RAM 0x1000 OVERLAY{module2.o (+RW,+ZI)}... ; rest of scatter description...}如 果 静 态 区 域 的 长 度 是 未 知 的 , 请 使 用 0 相 对 偏 移 来 指 定 重 叠 区 的 开 始 地 址 , 以便 将 其 紧 靠 静 态 节 末 尾 放 置 , 例 如 :OVERLAY_A_RAM +0 OVERLAY在 这 种 情 况 下 , 具 有 相 同 +offset 的 连 续 重 叠 区 将 放 在 上 一 个 非 重 叠 区 或 加 载 区开 头 后 面 +offset 个 字 节 处 。 这 样 做 是 为 了 避 免 出 现 未 使 用 的 RAM( 其 中 的 静 态区 域 较 小 ), 或 防 止 重 叠 区 覆 盖 静 态 区 域 ( 其 中 的 静 态 区 域 较 大 )。5-40 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件5.3.5 为 根 区 分 配 节在 RVCT 2.1 及 更 早 版 本 中 , 唯 一 需 要 放 在 根 区 中 的 库 节 是 __main 和 区 表 。 但是 , 在 实 现 RW 数 据 压 缩 后 , 需 要 将 更 多 的 节 放 在 根 区 中 。 链 接 器 可 以 使 用InRoot$$Sections 自 动 放 置 这 些 节 。可 以 使 用 分 散 加 载 描 述 文 件 , 按 照 与 已 命 名 的 节 相 同 的 方 法 指 定 根 节 。 示 例 5-19使 用 节 选 择 器 InRoot$$Sections, 将 必 须 位 于 根 区 中 的 所 有 节 放 在 名 为 ER_ROOT 的区 中 。示 例 5-19 指 定 根 区LR_FLASH 0x0{ER_ROOT 0x0; root region at 0x0{vectors.o (Vectors, +FIRST) ; vector table* (InRoot$$Sections) ; all library sections that must be; in a root region}... ; rest of scatter description...}5.3.6 保 留 空 白 区可 以 在 执 行 区 分 散 加 载 描 述 中 使 用 EMPTY 属 性 , 为 堆 栈 保 留 一 个 空 白 内 存 块 。该 内 存 块 并 不 构 成 加 载 区 的 一 部 分 , 而 是 在 执 行 时 分 配 使 用 的 。 由 于 它 是 作 为虚 ZI 区 创 建 的 , 因 此 链 接 器 使 用 以 下 符 号 对 其 进 行 访 问 :• Image$$region_name$$ZI$$Base• Image$$region_name$$ZI$$Limit• Image$$region_name$$ZI$$Length.如 果 指 定 的 长 度 为 负 值 , 则 将 该 地 址 作 为 区 结 束 地 址 。 它 必 须 是 绝 对 地 址 , 而 不是 相 对 地 址 。 例 如 , 第 5-42 页 的 示 例 5-20 中 说 明 的 执 行 区 定 义 STACK 0x800000EMPTY -0x10000 定 义 了 一 个 名 为 STACK 的 区 , 它 的 开 始 地 址 是 0x7F0000, 结 束 地 址是 0x800000。注 意在 运 行 时 , 不 会 将 为 EMPTY 执 行 区 创 建 的 虚 ZI 区 初 始 化 为 零 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-41


使 用 分 散 加 载 描 述 文 件如 果 地 址 采 用 相 对 格 式 (+n), 并 且 长 度 为 负 值 , 链 接 器 将 生 成 错 误 。示 例 5-20 为 堆 栈 保 留 区LR_1 0x80000{STACK 0x800000 EMPTY -0x10000region}{}HEAP +0 EMPTY 0x10000; load region starts at 0x80000; region ends at 0x800000 because of the; negative length. The start of the; is calculated using the length.; Empty region used to place stack; region starts at the end of previous; region. End of region calculated using; positive length{; Empty region used to place heap}... ; rest of scatter description...图 5-10 是 此 示 例 的 图 形 表 示 形 式 。在 此 示 例 中 , 链 接 器 生 成 以 下 符 号 :图 5-10 为 堆 栈 保 留 区Image$$STACK$$ZI$$BaseImage$$STACK$$ZI$$LimitImage$$STACK$$ZI$$Length= 0x7f0000= 0x800000= 0x100005-42 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件Image$$HEAP$$ZI$$BaseImage$$HEAP$$ZI$$LimitImage$$HEAP$$ZI$$Length= 0x800000= 0x810000= 0x10000注 意EMPTY 属 性 仅 适 用 于 执 行 区 。 如 果 在 加 载 区 定 义 中 使 用 EMPTY 属 性 , 链 接 器 将 生 成警 告 并 忽 略 该 属 性 。链 接 器 检 查 用 于 EMPTY 区 的 地 址 空 间 是 否 与 任 何 其 他 执 行 区 重 叠 。5.3.7 放 置 <strong>ARM</strong> 库可 以 将 <strong>ARM</strong> 标 准 C 和 C++ 库 中 的 代 码 放 在 分 散 加 载 描 述 文 件 中 。 应 使 用*armlib 或 *armlib*, 以 使 链 接 器 能 够 解 析 分 散 加 载 文 件 中 的 库 命 名 。 例 如 :ER 0x2000{*armlib/c_* (+RO); all <strong>ARM</strong>-supplied C libraries... ; rest of scatter description...}示 例 5-21 说 明 了 如 何 放 置 库 代 码 。注 意示 例 5-21 在 路 径 名 中 使 用 正 斜 杠 , 以 确 保 在 Windows 和 Unix 平 台 上 能 够 识 别 它们 。示 例 5-21 放 置 <strong>ARM</strong> 库 代 码ROM1 0{* (InRoot$$Sections)* (+RO)ROM2 0x1000{*armlib/c_* (+RO)}}ROM3 0x2000{*armlib/h_* (+RO)}RAM1 0x3000; all <strong>ARM</strong>-supplied C library functions; just the <strong>ARM</strong>-supplied __<strong>ARM</strong>_*; redistributable library functions<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-43


使 用 分 散 加 载 描 述 文 件{*armlib* (+RO)}RAM2 0x4000{* (+RW, +ZI)}; all other <strong>ARM</strong>-supplied library code; e.g. floating-point libraries5.3.8 在 页 面 边 界 上 创 建 区ALIGN 指 令 生 成 一 个 ELF 文 件 , 可 以 将 该 文 件 直 接 加 载 到 从 页 面 边 界 开 始 的 每 个执 行 区 的 目 标 中 。示 例 5-22 假 定 页 面 大 小 为 65536, 并 为 从 新 页 开 始 的 每 个 区 生 成 一 个 ELF 文件 。示 例 5-22 在 页 面 边 界 上 创 建 区LR1 +4 ALIGN 65536 ; load region at 65536{ER1 +0 ALIGN 65536; first region at first page boundary{*(+RO); all RO sections are placed consecutively here}ER2 +0 ALIGN 65536; second region at next available page boundary{*(+RW); all RW sections are placed consecutively here}ER3 +0 ALIGN 65536; third region at next available page boundary{*(+ZI); all ZI sections are placed consecutively here}... ; rest of scatter description...}5-44 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件5.3.9 使 用 预 处 理 指 令可 以 使 用 分 散 加 载 描 述 文 件 中 的 第 一 行 , 指 定 链 接 器 为 处 理 该 文 件 而 调 用 的 预处 理 程 序 。 此 命 令 的 格 式 如 下 :#! [pre_processor_flags]通 常 情 况 下 , 此 命 令 是 #! armcc -E。链 接 器 可 以 使 用 一 组 有 限 的 运 算 符 执 行 简 单 的 表 达 式 求 值 , 即 +、- 、*、/、AND、OR和 括 号 。 OR 和 AND 实 现 遵 循 C 运 算 符 优 先 级 规 则 。您 可 以 将 预 处 理 指 令 添 加 到 分 散 加 载 描 述 文 件 的 顶 部 。 例 如 :#define ADDRESS 0x20000000#include "include_file_1.h"链 接 器 解 析 预 处 理 的 分 散 加 载 描 述 文 件 , 其 中 将 这 些 指 令 视 为 注 释 并 忽 略 。举 一 个 简 单 的 例 子 :#define AN_ADDRESS (BASE_ADDRESS+(ALIAS_NUMBER*ALIAS_SIZE))使 用 以 下 指 令 :#define BASE_ADDRESS 0x8000#define ALIAS_NUMBER 0x2#define ALIAS_SIZE 0x400如 果 分 散 加 载 描 述 文 件 包 含 :LOAD_FLASH AN_ADDRESS; start address进 行 预 处 理 后 , 将 对 其 进 行 计 算 , 结 果 为 :LOAD_FLASH ( 0x8000 + ( 0x2 * 0x400 )) ; start address在 进 行 计 算 后 , 链 接 器 解 析 分 散 加 载 文 件 以 生 成 加 载 区 :LOAD_FLASH 0x8808 ; start address有 关 使 用 --predefine 命 令 行 选 项 的 详 细 信 息 , 请 参 阅 第 2-11 页 的 为 映 像 指 定 内存 映 射 信 息 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-45


使 用 分 散 加 载 描 述 文 件5.4 简 单 映 像 的 等 效 分 散 加 载 描 述第 3-24 页 的 使 用 命 令 行 选 项 创 建 简 单 映 像 中 介 绍 了 如 何 使 用 以 下 命 令 行 选 项 创建 简 单 映 像 类 型 :--reloc、--ro-base、--rw-base、--ropi、--rwpi 和 --split。 通 过使 用 --scatter 命 令 行 选 项 以 及 包 含 相 应 分 散 加 载 描 述 之 一 的 文 件 , 可 以 创 建 相同 的 映 像 类 型 。5.4.1 类 型 1, 一 个 加 载 区 和 几 个 连 续 执 行 区此 类 映 像 由 加 载 视 图 中 的 单 个 加 载 区 以 及 执 行 视 图 中 的 三 个 执 行 区 组 成 。 执 行区 是 在 内 存 映 射 中 连 续 放 置 的 。--ro-base address 指 定 包 含 RO 输 出 节 的 区 的 加 载 和 执 行 地 址 。 示 例 5-23 说 明 了与 使 用 --ro-base 0x040000 等 效 的 分 散 加 载 描 述 。示 例 5-23 单 个 加 载 区 和 几 个 连 续 执 行 区LR_1 0x040000 ; Define the load region name as LR_1, the region starts at 0x040000.{ER_RO +0 ; First execution region is called ER_RO, region starts at end of previous region.; However, since there is no previous region, the address is 0x040000.{* (+RO) ; All RO sections go into this region, they are placed consecutively.}ER_RW +0 ; Second execution region is called ER_RW, the region starts at the end of the; previous region. The address is 0x040000 + size of ER_RO region.{* (+RW) ; All RW sections go into this region, they are placed consecutively.}}ER_ZI +0{}; Last execution region is called ER_ZI, the region starts at the end of the; previous region at 0x040000 + the size of the ER_RO regions + the size of; the ER_RW regions.* (+ZI) ; All ZI sections are placed consecutively here.示 例 5-23 中 所 示 的 描 述 创 建 一 个 映 像 , 其 中 包 含 一 个 名 为 LR_1 的 加 载 区 , 其 加载 地 址 为 0x040000。5-46 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件该 映 像 包 含 三 个 名 为 ER_RO、ER_RW 和 ER_ZI 的 执 行 区 , 它 们 分 别 包 含 RO、RW 和ZI 输 出 节 。 RO 和 RW 是 根 区 。 ZI 是 在 运 行 时 动 态 创 建 的 。 ER_RO 的 执 行 地 址 是0x040000。 通 过 在 执 行 区 描 述 中 使 用 +offset 格 式 的 基 址 指 示 符 , 可 以 在 内 存 映 射中 连 续 放 置 所 有 三 个 执 行 区 。 这 样 , 即 可 紧 靠 前 一 个 执 行 区 后 面 放 置 下 一 个 执行 区 。--reloc 选 项 用 于 生 成 可 重 定 位 的 映 像 。 单 独 使 用 时 ,--reloc 生 成 的 映 像 类 似 于简 单 类 型 1, 但 单 个 加 载 区 具 有 RELOC 属 性 。修 改 后 的 ropi 示 例 版 本在 此 版 本 中 , 执 行 区 连 续 放 置 在 内 存 映 射 中 。 但 是 ,--ropi 将 包 含 RO 输 出 节 的加 载 和 执 行 区 标 记 为 与 位 置 无 关 。示 例 5-24 说 明 了 与 使 用 --ro-base 0x010000 --ropi 等 效 的 分 散 加 载 描 述 。示 例 5-24 与 位 置 无 关 的 代 码LR_1 0x010000 PI ; The first load region is at 0x010000.{ER_RO +0; The PI attribute is inherited from parent.; The default execution address is 0x010000, but the code can be moved.{* (+RO) ; All the RO sections go here.}ER_RW +0 ABSOLUTE ; PI attribute is overridden by ABSOLUTE.{* (+RW) ; The RW sections are placed next. They cannot be moved.}ER_ZI +0; ER_ZI region placed after ER_RW region.{* (+ZI) ; All the ZI sections are placed consecutively here.}}正 如 示 例 5-24 中 所 示 ,RO 执 行 区 ER_RO 从 加 载 区 LR_1 继 承 PI 属 性 。 下 一 个 执 行区 ER_RW 被 标 记 为 ABSOLUTE, 并 使 用 +offset 格 式 的 基 址 指 示 符 。 这 可 防 止 ER_RW从 ER_RO 继 承 PI 属 性 。 另 外 , 由 于 ER_ZI 区 的 偏 移 为 +0, 因 此 它 从 ER_RW 区 继 承ABSOLUTE 属 性 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-47


使 用 分 散 加 载 描 述 文 件5.4.2 类 型 2, 一 个 加 载 区 和 几 个 不 连 续 的 执 行 区此 类 映 像 由 加 载 视 图 中 的 单 个 加 载 区 以 及 执 行 视 图 中 的 三 个 执 行 区 组 成 。 它 与类 型 1 映 像 相 似 , 但 RW 执 行 区 与 RO 执 行 区 不 相 邻 。--ro-base address1 指 定 包 含 RO 输 出 节 的 区 的 加 载 和 执 行 地 址 。--rw-baseaddress2 指 定 RW 执 行 区 的 执 行 地 址 。示 例 5-25 说 明 了 与 使 用 --ro-base 0x010000 --rw-base 0x040000 等 效 的 分 散 加 载 描述 。示 例 5-25 单 个 加 载 区 和 多 个 执 行 区LR_1 0x010000{ER_RO +0}; Defines the load region name as LR_1; The first execution region is called ER_RO and starts at end of previous region.; Since there is no previous region, the address is 0x010000.{* (+RO) ; All RO sections are placed consecutively into this region.}ER_RW 0x040000 ; Second execution region is called ER_RW and starts at 0x040000.{* (+RW) ; All RW sections are placed consecutively into this region.}ER_ZI +0; The last execution region is called ER_ZI.; The address is 0x040000 + size of ER_RW region.{* (+ZI) ; All ZI sections are placed consecutively here.}此 描 述 创 建 一 个 映 像 , 其 中 包 含 一 个 名 为 LR_1 的 加 载 区 , 其 加 载 地 址 是0x010000。该 映 像 包 含 三 个 名 为 ER_RO、ER_RW 和 ER_ZI 的 执 行 区 , 它 们 分 别 包 含 RO、RW 和ZI 输 出 节 。 RO 区 是 根 区 。 ER_RO 的 执 行 地 址 是 0x010000。ER_RW 执 行 区 与 ER_RO 不 相 邻 。 其 执 行 地 址 是 0x040000。ER_ZI 执 行 区 紧 靠 上 一 个 执 行 区 ER_RW 后 面 放 置 。5-48 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件修 改 后 的 rwpi 示 例 版 本这 与 使 用 --rw-base 的 类 型 2 映 像 相 似 ,RW 执 行 区 与 RO 执 行 区 是 分 开 的 。 但是 ,--rwpi 将 包 含 RW 输 出 节 的 执 行 区 标 记 为 与 位 置 无 关 。示 例 5-26 说 明 了 与 使 用 --ro-base 0x010000 --rw-base 0x018000 --rwpi 等 效 的 分 散加 载 描 述 。示 例 5-26 与 位 置 无 关 的 数 据LR_1 0x010000 ; The first load region is at 0x010000.{ER_RO +0; Default ABSOLUTE attribute is inherited from parent. The execution address; is 0x010000. The code and ro data cannot be moved.{* (+RO) ; All the RO sections go here.}ER_RW 0x018000 PI ; PI attribute overrides ABSOLUTE{* (+RW) ; The RW sections are placed at 0x018000 and they can be moved.}ER_ZI +0; ER_ZI region placed after ER_RW region.{* (+ZI) ; All the ZI sections are placed consecutively here.}}RO 执 行 区 ER_RO 从 加 载 区 LR_1 继 承 ABSOLUTE 属 性 。 下 一 个 执 行 区 ER_RW 被 标 记为 PI。 另 外 , 由 于 ER_ZI 区 的 偏 移 为 +0, 因 此 它 从 ER_RW 区 继 承 PI 属 性 。还 可 以 编 写 类 似 的 分 散 加 载 描 述 , 以 对 应 于 --ropi 和 --rwpi 与 类 型 2 和 类 型 3 映像 的 其 他 组 合 用 法 。5.4.3 类 型 3, 两 个 加 载 区 和 几 个 不 连 续 的 执 行 区类 型 3 映 像 由 加 载 视 图 中 的 两 个 加 载 区 以 及 执 行 视 图 中 的 三 个 执 行 区 组 成 。 它们 与 类 型 2 映 像 相 似 , 但 类 型 2 映 像 中 的 单 个 加 载 区 现 在 拆 分 为 两 个 加 载 区 。可 以 使 用 以 下 链 接 器 选 项 重 定 位 并 拆 分 加 载 区 :--reloc--reloc --split 组 合 生 成 的 映 像 类 似 于 简 单 类 型 3, 但 两 个 加 载 区现 在 具 有 RELOC 属 性 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-49


使 用 分 散 加 载 描 述 文 件--ro-base address1--rw-base address2指 定 包 含 RO 输 出 节 的 区 的 加 载 和 执 行 地 址 。指 定 包 含 RW 输 出 节 的 区 的 加 载 和 执 行 地 址 。--split 将 缺 省 的 单 个 加 载 区 ( 包 含 RO 和 RW 输 出 节 ) 拆 分 为 两 个 加 载 区 。一 个 加 载 区 包 含 RO 输 出 节 ; 另 一 个 加 载 区 包 含 RW 输 出 节 。示 例 5-27 说 明 了 与 使 用 --ro-base 0x010000 --rw-base 0x040000 --split 等 效 的 分 散加 载 描 述 。在 本 示 例 中 :• 此 描 述 创 建 一 个 映 像 , 其 中 包 含 两 个 名 为 LR_1 和 LR_2 的 加 载 区 , 它 们 的 加载 地 址 是 0x010000 和 0x040000。• 该 映 像 包 含 三 个 名 为 ER_RO、ER_RW 和 ER_ZI 的 执 行 区 , 它 们 分 别 包 含 RO、RW 和 ZI 输 出 节 。 ER_RO 的 执 行 地 址 是 0x010000。• ER_RW 执 行 区 与 ER_RO 不 相 邻 。 其 执 行 地 址 是 0x040000。• ER_ZI 执 行 区 紧 靠 上 一 个 执 行 区 ER_RW 后 面 放 置 。示 例 5-27 多 个 加 载 区LR_1 0x010000 ; The first load region is at 0x010000.{ER_RO +0 ; The address is 0x010000.{* (+RO)}}LR_2 0x040000 ; The second load region is at 0x040000.{ER_RW +0 ; The address is 0x040000.{* (+RW) ; All RW sections are placed consecutively into this region.}ER_ZI +0 ; The address is 0x040000 + size of ER_RW region.{* (+ZI) ; All ZI sections are placed consecutively into this region.}}5-50 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 分 散 加 载 描 述 文 件修 改 后 的 可 重 定 位 的 加 载 区 示 例 版 本此 类 型 3 映 像 也 由 加 载 视 图 中 的 两 个 加 载 区 以 及 执 行 视 图 中 的 三 个 执 行 区 组成 。 但 是 , 用 于 指 定 两 个 加 载 区 的 --reloc 现 在 具 有 RELOC 属 性 。示 例 5-28 说 明 了 与 使 用 --ro-base 0x010000 --rw-base 0x040000 --reloc --split 等效 的 分 散 加 载 描 述 。示 例 5-28 可 重 定 位 的 加 载 区LR_1 0x010000 RELOC{ER_RO + 0{* (+RO)}}LR2 0x040000 RELOC{ER_RW + 0{* (+RW)}}ER_ZI +0{* (+ZI)}<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 5-51


使 用 分 散 加 载 描 述 文 件5-52 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


第 6 章BPABI 和 System V 共 享 库 和 可 执 行 文 件本 章 介 绍 了 <strong>ARM</strong> 链 接 器 armlink 如 何 支 持 BPABI 和 System V 共 享 库 和 可 执 行 文件 。 它 包 含 以 下 几 节 :• 第 6-2 页 的 基 本 平 台 ABI• 第 6-3 页 的 使 用 BPABI 共 享 库 和 可 执 行 文 件• 第 6-6 页 的 使 用 SVr4 共 享 库 和 可 执 行 文 件<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 6-1


BPABI 和 System V 共 享 库 和 可 执 行 文 件6.1 基 本 平 台 ABIBPABI 控 制 静 态 链 接 器 生 成 的 可 执 行 文 件 和 共 享 目 标 文 件 的 格 式 和 内 容 。 它 使用 后 链 接 支 持 平 台 特 定 的 可 执 行 文 件 , 并 提 供 用 于 派 生 平 台 ABI 的 基 本 标 准 。此 标 准 基 于 共 享 对 象 模 型 定 义 了 三 个 平 台 系 列 :• 裸 机• 类 似 于 DLL• System V 版 本 4 (SVr4)。链 接 器 符 合 BPABI, 因 此 , 您 可 以 :• 将 对 象 和 库 集 合 链 接 到 :— 裸 机 可 执 行 映 像— BPABI DLL 或 SVr4 共 享 对 象— BPABI 或 SVr4 可 执 行 文 件 。• 将 对 象 集 合 链 接 到 共 享 库 上• 将 对 象 集 合 部 分 链 接 到 一 个 对 象 上 , 该 对 象 可 用 作 后 续 链 接 步 骤 的 输 入 。6.1.1 获 得 更 多 信 息有 关 基 本 标 准 、 软 件 接 口 以 及 <strong>ARM</strong> 支 持 的 标 准 的 信 息 , 请 参 阅install_directory\Documentation\Specifications\...。有 关 最 新 发 行 的 版 本 的 信 息 , 请 访 问 http://www.arm.com。请 参 阅 <strong>ARM</strong> 《 应 用 程 序 注 释 178 (<strong>ARM</strong> DAI 0178): 使 用 RVDS 3.1 以 及 GNU 工 具和 库 构 建 Linux 应 用 程 序 》。有 关 通 用 System V ABI 的 详 细 信 息 , 请 访 问 http://www.sco.com。6-2 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


BPABI 和 System V 共 享 库 和 可 执 行 文 件6.2 使 用 BPABI 共 享 库 和 可 执 行 文 件通 过 使 用 链 接 器 , 您 可 以 构 建 BPABI 共 享 库 并 将 对 象 链 接 到 共 享 库 上 。6.2.1 关 于 BPABIBPABI 对 可 执 行 文 件 ( 包 括 DLL 和 动 态 共 享 对 象 (DSO)) 之 间 的 接 口 及 其 执 行环 境 或 平 台 进 行 了 标 准 化 。 ABI 定 义 了 四 个 平 台 系 列 , 具 体 取 决 于 它 们 如 何 管理 动 态 加 载 的 可 执 行 文 件 :• 对 应 于 完 全 静 态 链 接 的 裸 机 平 台 , 没 有 动 态 加 载 的 二 进 制 文 件• 使 用 DLL 的 平 台 , 单 个 地 址 空 间 中 的 多 个 进 程 加 载 和 使 用 这 些 DLL• 使 用 DLL 的 平 台 , 通 过 在 不 同 虚 拟 地 址 空 间 中 的 相 同 地 址 映 射 这 些 DLL的 段• 类 似 于 System V 的 平 台 , 可 以 在 每 个 不 同 虚 拟 地 址 空 间 中 的 不 同 地 址 映 射动 态 共 享 对 象 。每 个 特 定 平 台 都 基 于 BPABI 为 满 足 其 各 自 需 求 而 提 供 的 基 础 模 型 , 如 应 用 程 序标 准 和 构 建 参 数 。 平 台 特 定 的 后 处 理 工 具 ( 如 后 链 接 器 ) 使 用 这 些 模 型 , 将BPABI 可 执 行 文 件 或 共 享 对 象 转 换 为 该 执 行 环 境 的 完 整 可 执 行 文 件 或 共 享 对象 。BPABI 还 支 持 不 同 的 寻 址 模 式 , 它 们 对 应 于 各 种 平 台 系 列 中 代 码 引 用 静 态 数 据的 不 同 方 式 。 代 码 可 以 直 接 对 静 态 数 据 进 行 寻 址 , 也 可 以 通 过 单 独 的 动 态 重 定位 间 接 进 行 寻 址 ; 寻 址 可 以 是 绝 对 寻 址 、PC 相 对 的 寻 址 或 相 对 于 寄 存 器 r9 中 存储 的 静 态 基 址 的 寻 址 。有 关 平 台 类 别 、 寻 址 模 式 和 动 态 链 接 问 题 的 详 细 信 息 , 请 参 阅 BPABI。6.2.2 符 号 导 入 和 导 出可 执 行 文 件 和 DLL 可 以 导 出 所 定 义 的 符 号 , 以 供 其 他 可 执 行 文 件 和 DLL 使 用 。它 们 也 可 以 从 其 他 DLL 中 导 入 符 号 。要 在 BPABI 可 执 行 文 件 或 DLL 中 指 定 导 入 符 号 , 建 议 的 方 法 是 在 函 数 声 明 中 使用 __declspec(dllimport) 属 性 , 因 为 生 成 的 代 码 必 须 按 正 确 方 式 访 问 引 用 。 但是 , 如 果 没 有 定 义 符 号 的 DLL 的 访 问 权 限 , 您 也 可 以 在 链 接 器 控 制 文 件 中 使 用IMPORT 指 令 导 入 符 号 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 6-3


BPABI 和 System V 共 享 库 和 可 执 行 文 件要 将 符 号 标 记 为 进 行 动 态 导 出 , 您 可 以 在 控 制 文 件 中 使 用 EXPORT 属 性 , 或 者 在 符号 声 明 中 使 用 __declspec(dllexport) 属 性 。 可 以 使 用 --export_all 开 关 , 从BPABI 可 执 行 文 件 或 DLL 中 动 态 导 出 所 有 全 局 非 隐 藏 符 号 。 如 果 没 有 指 定 任 何控 制 文 件 命 令 , 链 接 器 将 缺 省 导 出 所 有 全 局 非 隐 藏 符 号 。当 链 接 器 在 命 令 行 中 指 定 的 共 享 对 象 的 动 态 符 号 表 中 找 到 匹 配 定 义 时 , 则 会 导入 未 定 义 的 符 号 引 用 。 以 后 , 这 些 符 号 将 被 视 为 从 该 共 享 对 象 或 DLL( 对 于BPABI) 中 导 入 的 。非 隐 藏 符 号 是 指 在 汇 编 程 序 源 文 件 中 具 有 DYNAMIC 或 PROTECTED 可 见 度 属 性 的 符号 , 或 者 其 中 的 C 源 代 码 包 含 __declspec(dllimport) 或 __declspec(dllexport) 属性 。有 关 详 细 信 息 , 请 参 阅 :• 第 4-11 页 的 隐 藏 和 重 命 名 全 局 符 号• 《 编 译 器 参 考 指 南 》 中 的 第 4-24 页 的 __declspec 属 性 。6.2.3 符 号 可 见 度链 接 器 支 持 符 号 可 见 度 。 符 号 可 见 度 影 响 静 态 链 接 器 和 动 态 链 接 器 。 本 节 介 绍了 每 种 可 见 度 对 armlink 的 影 响 。 有 关 详 细 信 息 , 请 参 阅 《<strong>ARM</strong> ELF 规 范 》。6.2.4 符 号 版 本 控 制链 接 器 支 持 符 号 版 本 。 这 为 符 号 表 提 供 了 更 多 有 用 的 信 息 :• 无 法 从 外 部 引 用 区 分 版 本 的 共 享 对 象 中 具 有 局 部 作 用 域 的 符 号 。• 区 分 版 本 的 全 局 符 号 没 有 版 本 , 因 此 通 常 的 符 号 匹 配 适 用 。• 设 置 了 HIDDEN 可 见 度 属 性 的 区 分 版 本 符 号 是 不 提 倡 使 用 的 区 分 版 本 符 号 。静 态 链 接 器 将 忽 略 这 种 符 号 。• 未 在 其 中 设 置 HIDDEN 可 见 度 属 性 的 区 分 版 本 符 号 是 缺 省 符 号 。在 加 载 包 含 符 号 版 本 控 制 表 的 共 享 对 象 时 , 将 在 符 号 表 中 添 加 符 号 版 本 控 制 信息 , 并 匹 配 对 区 分 版 本 符 号 的 引 用 。 可 以 使 用 版 本 脚 本 文 件 , 通 过--symver_script 选 项 指 定 导 出 的 符 号 列 表 。 有 关 详 细 信 息 , 请 参 阅 第 2-15 页 的 控制 映 像 内 容 中 的 --symver_script。6-4 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


BPABI 和 System V 共 享 库 和 可 执 行 文 件6.2.5 内 存 映 射对 于 BPABI 可 执 行 文 件 和 DLL 映 像 , 映 像 布 局 对 应 于 以 下 分 散 文 件 描 述 :LR_1 {ER_RO +0{*(+RO)}}LR_2 {ER_RW +0{*(+RW)}ER_ZI +0{*(+ZI)}}如 果 指 定 了 --ropi 选 项 , 则 会 将 LR_1 标 记 为 与 位 置 无 关 。 同 样 地 , 如 果 指 定 了--rwpi 选 项 , 则 会 将 LR_2 标 记 为 与 位 置 无 关 。注 意在 大 多 数 情 况 下 , 您 必 须 指 定 --ro-base 和 --rw-base 开 关 , 因 为 缺 省 值 可 能 并 不适 用 于 您 的 平 台 。 这 些 地 址 并 不 需 要 反 映 在 运 行 时 将 映 像 重 定 位 到 的 实 际 地址 。有 关 详 细 信 息 , 请 参 阅 :• 第 2-11 页 的 为 映 像 指 定 内 存 映 射 信 息 中 的 --ropi• 第 2-11 页 的 为 映 像 指 定 内 存 映 射 信 息 中 的 --rwpi• 第 2-11 页 的 为 映 像 指 定 内 存 映 射 信 息 中 的 --ro-base• 第 2-11 页 的 为 映 像 指 定 内 存 映 射 信 息 中 的 --rw-base。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 6-5


BPABI 和 System V 共 享 库 和 可 执 行 文 件6.3 使 用 SVr4 共 享 库 和 可 执 行 文 件通 过 使 用 链 接 器 , 您 可 以 构 建 SVr4 共 享 库 并 将 对 象 链 接 到 共 享 库 上 。6.3.1 构 建 <strong>ARM</strong> Linux 可 执 行 文 件可 以 使 用 --sysv 命 令 行 选 项 , 生 成 可 在 <strong>ARM</strong> Linux 上 使 用 的 SVr4 格 式 的 ELF 可执 行 文 件 。注 意如 果 使 用 --sysv, 链 接 器 将 忽 略 在 命 令 行 中 指 定 的 任 何 分 散 加 载 文 件 。缺 省 情 况 下 , 可 执 行 文 件 的 基 址 是 0x8000。 如 果 在 命 令 行 中 指 定 共 享 对 象 , 链 接器 将 使 用 这 些 对 象 来 解 析 引 用 并 创 建 动 态 可 执 行 文 件 。当 链 接 器 找 到 命 令 行 中 的 共 享 对 象 时 , 则 会 将 其 包 括 在 要 添 加 到 可 执 行 文 件 中的 库 列 表 上 。 有 关 详 细 信 息 , 请 参 阅 第 7-3 页 的 库 搜 索 、 选 择 和 扫 描 。如 果 在 <strong>ARM</strong> Linux 中 工 作 , 请 注 意 以 下 事 项 :• Linux 内 核 执 行 可 执 行 文 件 的 所 有 复 制 和 零 初 始 化 。• 不 会 对 RW 数 据 进 行 压 缩 。• 可 执 行 文 件 始 终 进 入 <strong>ARM</strong> 状 态 。6-6 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


BPABI 和 System V 共 享 库 和 可 执 行 文 件构 建 共 享 对 象共 享 对 象 提 供 了 静 态 和 动 态 链 接 的 扩 展 , 如 第 6-6 页 的 构 建 <strong>ARM</strong> Linux 可 执 行 文件 所 述 。 加 载 区 的 基 址 被 设 置 为 0,Linux 动 态 链 接 器 随 后 将 对 其 重 定 位 。如 果 共 享 对 象 包 含 任 何 导 出 的 RW 数 据 , 则 需 要 使 用 与 位 置 无 关 的 代 码 和 数 据 。在 这 种 情 况 下 , 您 必 须 使 用 --apcs /fpic 编 译 或 汇 编 文 件 , 然 后 使 用 --fpic 链 接器 选 项 将 文 件 链 接 到 共 享 对 象 上 。可 以 使 用 --shared 命 令 行 选 项 来 构 建 SVr4 共 享 对 象 。注 意共 享 对 象 通 常 没 有 入 口 点 。 但 是 , 您 可 以 设 置 一 个 入 口 点 。 如 果 构 建 的 对 象 是动 态 链 接 器 , 则 必 须 执 行 此 操 作 。使 用 Linux ABI 标 签为 符 合 Linux 标 准 基 本 规 范 1.2 版 , 可 执 行 文 件 必 须 包 含 一 个 名 为.note.ABI-tag、 类 型 为 SHT_NOTE 的 节 , 并 将 其 设 置 为 注 释 节 ( 如 ELF 规 范 所 述 )。可 以 使 用 命 令 行 选 项 --linux_abitag 指 定 所 构 建 的 可 执 行 文 件 的 最 低 兼 容 内 核版 本 , 例 如 :armlink ... --sysv --linux_abitag 2.2.5 main.o它 将 main.o 链 接 到 一 个 静 态 可 执 行 文 件 上 , 该 文 件 被 定 义 为 与 Linux 内 核 2.2.5或 更 高 版 本 兼 容 。 如 果 命 令 行 中 指 定 的 任 何 共 享 对 象 要 求 使 用 较 新 的 内 核 , 则需 要 增 加 输 出 文 件 中 的 内 核 要 求 以 便 与 其 相 匹 配 。有 关 使 用 Linux ABI 标 签 和 标 准 基 本 规 范 的 详 细 信 息 , 请 访 问http://www.linuxbase.org。6.3.2 访 问 符 号符 号 表 提 供 了 一 种 方 法 , 来 确 定 链 接 阶 段 包 含 的 其 他 非 共 享 对 象 所 引 用 的 共 享对 象 中 的 符 号 。 如 果 存 在 符 号 引 用 , 则 会 将 其 定 义 为 是 从 共 享 对 象 中 导 入 的 。链 接 器 支 持 符 号 版 本 。 这 为 符 号 表 提 供 了 更 多 有 用 的 信 息 :• 无 法 从 外 部 引 用 区 分 版 本 的 共 享 对 象 中 具 有 局 部 作 用 域 的 符 号 。• 区 分 版 本 的 全 局 符 号 没 有 版 本 , 因 此 通 常 的 符 号 匹 配 适 用 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 6-7


BPABI 和 System V 共 享 库 和 可 执 行 文 件• 设 置 了 HIDDEN 可 见 度 属 性 的 区 分 版 本 符 号 是 不 提 倡 使 用 的 区 分 版 本 符 号 。静 态 链 接 器 将 忽 略 这 种 符 号 。• 未 在 其 中 设 置 HIDDEN 可 见 度 属 性 的 区 分 版 本 符 号 是 缺 省 符 号 。在 加 载 包 含 符 号 版 本 控 制 表 的 共 享 对 象 时 , 将 在 符 号 表 中 添 加 符 号 版 本 控 制 信息 ( 并 匹 配 对 区 分 版 本 符 号 的 引 用 )。 可 以 使 用 版 本 脚 本 文 件 来 指 定 导 出 的 符 号列 表 , 例 如 :armlink file_1.o file_2.o --sysv --shared -o libfoo.so --symver_script ver_script.txt符 号 解 析链 接 器 按 相 同 方 式 解 析 共 享 对 象 和 非 共 享 对 象 中 的 符 号 。 如 果 未 定 义 的 引 用 与共 享 对 象 中 的 定 义 相 匹 配 , 链 接 器 就 会 将 该 引 用 放 在 动 态 符 号 表 中 以 将 其 导 入 。导 入 和 导 出 符 号当 链 接 器 在 命 令 行 中 指 定 的 共 享 对 象 的 动 态 符 号 表 中 找 到 匹 配 定 义 时 , 则 会 导入 未 定 义 的 符 号 引 用 。 以 后 , 这 些 符 号 将 被 视 为 导 出 的 符 号 。在 构 建 共 享 对 象 时 , 仅 导 出 通 过 控 制 文 件 指 令 、 源 文 件 中 存 在 的__declspec(dllexport) 或 --no_hide_all 选 项 标 记 为 导 出 的 那 些 对 象 。 如 果 没 有 指定 任 何 控 制 文 件 命 令 , 链 接 器 将 缺 省 导 出 所 有 全 局 ( 非 隐 藏 ) 符 号 。 非 隐 藏 符 号是 指 在 汇 编 程 序 源 文 件 中 具 有 DYNAMIC 或 PROTECTED 可 见 度 属 性 的 符 号 , 或 者 其 中的 C 源 代 码 包 含 __declspec(dllimport) 或 __declspec(dllexport)。 要 将 所 有 符 号标 记 为 非 隐 藏 , 请 使 用 --no_hide_all 选 项 。在 构 建 可 执 行 文 件 时 , 仅 导 出 在 Linux 平 台 上 正 确 执 行 映 像 所 需 的 符 号 。 即 , 链接 器 导 入 在 共 享 对 象 中 找 到 的 任 何 符 号 。 可 以 使 用 控 制 文 件 命 令 来 定 义 要 插 入到 动 态 符 号 表 中 的 其 他 符 号 。对 于 Linux 可 执 行 文 件 和 共 享 库 , 标 准 的 符 号 导 入 和 导 出 方 法 是 , 使 用--no_hide_all 编 译 器 或 汇 编 程 序 选 项 将 所 有 符 号 标 记 为 动 态 导 入 或 导 出 候 选 项 。要 将 单 个 符 号 标 记 为 动 态 导 入 和 导 出 候 选 项 , 请 使 用 控 制 文 件 。 可 以 在 该 文 件中 使 用 EXPORT 指 令 来 指 定 导 出 的 符 号 。注 意请 注 意 , 对 于 保 留 的 任 何 未 定 义 的 引 用 ,armlink 将 生 成 错 误 。有 关 使 用 EXPORT 的 详 细 信 息 , 请 参 阅 第 4-12 页 的 控 制 文 件 命 令 。6-8 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


BPABI 和 System V 共 享 库 和 可 执 行 文 件6.3.3 异 常 表在 不 使 用 共 享 库 的 静 态 映 像 中 , 如 果 链 接 器 确 定 映 像 无 法 抛 出 异 常 , 则 会 自 动 丢弃 异 常 表 。在 链 接 使 用 共 享 对 象 的 映 像 时 , 请 使 用 --force_so_throw 命 令 行 选 项 指 定 所 有 共享 对 象 可 能 会 抛 出 异 常 , 因 而 强 制 链 接 器 保 留 异 常 表 , 而 无 论 映 像 能 否 抛 出 异常 。6.3.4 线 程 局 部 存 储在 当 前 版 本 中 , 链 接 器 仅 支 持 SVr4 映 像 和 共 享 库 的 线 程 局 部 存 储 (TLS)。 有 关链 接 器 实 现 的 详 细 信 息 , 请 参 阅 《<strong>ARM</strong> 体 系 结 构 的 ABI 勘 误 表 和 附 录 》(ABI 附录 )。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 6-9


BPABI 和 System V 共 享 库 和 可 执 行 文 件6.3.5 使 用 动 态 链 接 器共 享 对 象 或 可 执 行 文 件 包 含 动 态 链 接 器 正 确 加 载 和 运 行 文 件 所 需 的 所 有 信 息 :• 每 个 共 享 对 象 都 包 含 一 个 用 于 标 识 该 对 象 的 SONAME。 可 以 在 命 令 行 中 使 用--soname name 选 项 指 定 此 名 称 。• 链 接 器 使 用 在 命 令 行 中 指 定 的 共 享 对 象 来 确 定 与 其 他 共 享 对 象 之 间 的 相 关性 。 这 些 共 享 对 象 相 关 性 是 在 DT_NEEDED 标 签 中 编 码 的 。 在 当 前 版 本 中 , 链接 器 对 这 些 标 签 进 行 排 序 以 使 其 与 命 令 行 中 的 库 顺 序 相 匹 配 。• 动 态 链 接 器 使 用 预 定 搜 索 路 径 来 搜 索 相 关 性 。 可 以 使 用 --runpath pathlist命 令 行 选 项 将 pathlist 中 的 路 径 添 加 到 搜 索 路 径 中 。 搜 索 路 径 是 使 用DT_RUNPATH 标 签 编 码 的 。• 缺 省 情 况 下 , 在 使 用 --sysv --shared 构 建 共 享 库 时 , 链 接 器 并 不 包 含 <strong>ARM</strong>C 库 初 始 化 函 数 __cpp_initialize__aeabi_。 而 是 由 链 接 器 设 置 DT_INIT_ARRAY标 签 ( 如 果 适 用 ), 以 使 动 态 链 接 器 能 够 初 始 化 该 库 。如 果 更 希 望 使 用 __cpp_initialize__aeabi_ 函 数 来 初 始 化 共 享 库 , 则 必 须 在命 令 行 中 添 加 --ref_cpp_init 并 设 置 --init=__cpp_initialize_aeabi_。• 如 果 指 定 --fini symbol 命 令 行 选 项 , 链 接 器 将 使 用 指 定 的 符 号 名 称 来 定 义终 止 代 码 。 当 动 态 链 接 器 卸 载 可 执 行 文 件 或 共 享 对 象 时 , 将 执 行 此 代 码 。并 未 假 定 由 名 为 _fini 的 符 号 标 记 此 代 码 。• 如 果 指 定 --fini symbol 命 令 行 选 项 , 链 接 器 将 使 用 指 定 的 符 号 名 称 来 定 义终 止 代 码 。 当 动 态 链 接 器 卸 载 可 执 行 文 件 或 共 享 对 象 时 , 将 执 行 此 代 码 。并 未 假 定 由 名 为 _fini 的 符 号 标 记 此 代 码 。可 以 使 用 --dynamiclinker name 命 令 行 选 项 来 指 定 用 于 在 运 行 时 加 载 和 重 定 位 文件 的 动 态 链 接 器 。 如 果 在 Linux 平 台 上 工 作 , 链 接 器 假 定 缺 省 动 态 链 接 器 为/lib/ld-linux.so.2。6-10 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


第 7 章使 用 <strong>ARM</strong> 库 管 理 程 序本 章 介 绍 了 如 何 在 <strong>ARM</strong> 链 接 器 armlink 和 库 管 理 程 序 armar 中 使 用 库 。 它 包 含 以下 几 节 :• 第 7-2 页 的 关 于 库• 第 7-3 页 的 库 搜 索 、 选 择 和 扫 描• 第 7-6 页 的 <strong>ARM</strong> 库 管 理 程 序<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 7-1


使 用 <strong>ARM</strong> 库 管 理 程 序7.1 关 于 库目 标 文 件 可 以 引 用 外 部 符 号 , 例 如 函 数 或 变 量 。 链 接 器 尝 试 通 过 将 这 些 引 用 与在 其 他 目 标 文 件 和 库 中 找 到 的 定 义 进 行 匹 配 来 解 析 它 们 。 链 接 器 将 存 储 在 ar 格式 文 件 中 的 ELF 文 件 集 合 视 为 库 。 每 个 ELF 文 件 的 内 容 构 成 库 中 的 单 个 成 员 。如 果 使 用 --sysv 生 成 一 个 SVr4 格 式 的 ELF 可 执 行 文 件 , 则 链 接 器 将 共 享 对 象 视为 库 。 同 样 , 当 生 成 BPABI 兼 容 的 可 执 行 文 件 时 , 将 共 享 对 象 或 DLL 视 为 库 。不 过 , 共 享 对 象 或 DLL 不 同 于 档 案 , 因 为 :• 符 号 从 共 享 对 象 或 DLL 中 导 入• 符 号 的 代 码 或 数 据 从 档 案 提 取 到 要 链 接 的 文 件 中 。本 章 的 其 他 部 分 介 绍 了 这 些 档 案 。7-2 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 <strong>ARM</strong> 库 管 理 程 序7.2 库 搜 索 、 选 择 和 扫 描链 接 器 向 映 像 添 加 目 标 文 件 的 方 式 与 向 映 像 添 加 库 的 方 式 的 不 同 之 处 是 :• 不 论 是 否 被 引 用 , 输 入 列 表 中 的 每 个 目 标 文 件 都 无 条 件 地 添 加 到 输 出 映像 。 必 须 至 少 指 定 一 个 对 象 。• 仅 当 目 标 文 件 或 已 包 含 的 库 成 员 对 库 成 员 进 行 非 弱 引 用 时 , 或 者 明 确 指 示链 接 器 添 加 库 成 员 时 , 库 成 员 才 包 含 在 输 出 中 。注 意如 果 在 输 入 文 件 列 表 中 明 确 请 求 库 成 员 , 则 即 使 它 不 解 析 任 何 当 前 引 用 ,也 会 载 入 它 。 在 这 种 情 况 下 , 明 确 请 求 的 成 员 被 视 为 普 通 对 象 。除 非 使 用 了 --no_remove, 否 则 随 后 将 删 除 未 使 用 的 节 。未 解 析 的 弱 符 号 引 用 不 会 导 致 加 载 库 成 员 。注 意如 果 指 定 --no_scanlib 命 令 行 选 项 , 则 链 接 器 不 搜 索 缺 省 的 <strong>ARM</strong> 库 , 而 仅 使 用输 入 文 件 列 表 中 指 定 的 那 些 库 来 解 析 引 用 。因 此 , 链 接 器 将 创 建 如 下 的 库 列 表 :1. 将 在 输 入 文 件 列 表 中 明 确 指 定 的 任 何 库 添 加 到 列 表 中 。2. 检 查 用 户 指 定 的 搜 索 路 径 来 标 识 <strong>ARM</strong> 标 准 库 , 以 便 满 足 输 入 对 象 中 嵌 入的 请 求 。从 搜 索 目 录 及 其 子 目 录 中 选 择 最 适 合 的 库 变 体 。 <strong>ARM</strong> 提 供 的 库 有 多 个 变体 , 它 们 根 据 成 员 的 属 性 进 行 命 名 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 7-3


使 用 <strong>ARM</strong> 库 管 理 程 序7.2.1 搜 索 <strong>ARM</strong> 库您 可 以 指 定 用 于 查 找 <strong>ARM</strong> 标 准 库 的 搜 索 路 径 , 方 法 是 :• 使 用 环 境 变 量 RVCT31LIB。 这 是 缺 省 设 置 。• 将 --libpath 选 项 添 加 到 armlink 命 令 行 , 并 在 命 令 行 中 包 含 用 逗 号 分 隔 的父 目 录 列 表 。此 列 表 必 须 以 <strong>ARM</strong> 库 目 录 armlib 和 cpplib 的 父 目 录 结 束 。 RVCT31LIB 环 境变 量 中 保 存 此 路 径 。注 意链 接 器 命 令 行 选 项 --libpath 可 覆 盖 由 RVCT31LIB 变 量 指 定 的 路 径 。链 接 器 将 --libpath 或 RVCT31LIB 变 量 提 供 的 每 个 父 目 录 与 输 入 对 象 中 的 每 个 子 目录 请 求 组 合 在 一 起 , 并 标 识 搜 索 <strong>ARM</strong> 库 的 位 置 。 使 用 格 式 为Lib$$Request$$sub_dir_name 的 符 号 , 将 父 目 录 中 <strong>ARM</strong> 子 目 录 的 名 称 放 在 每 个 编译 的 对 象 中 。如 果 两 个 或 更 多 个 库 定 义 了 同 一 个 符 号 , 则 搜 索 的 有 序 性 可 确 保 链 接 器 选 择 列表 中 较 早 出 现 的 库 。选 择 <strong>ARM</strong> 库 变 体根 据 其 成 员 对 象 的 属 性 , 有 不 同 的 <strong>ARM</strong> 库 变 体 。 <strong>ARM</strong> 库 的 变 体 被 编 码 为 库 名称 。 链 接 器 必 须 从 库 搜 索 时 识 别 的 每 个 目 录 中 选 择 最 适 合 的 变 体 。链 接 器 收 集 每 个 输 入 对 象 的 属 性 , 然 后 选 择 最 适 合 那 些 属 性 的 库 变 体 。 如 果 多个 选 定 的 库 同 样 适 合 , 则 链 接 器 保 留 第 一 个 选 定 的 库 而 拒 绝 其 他 所 有 的 库 。最 终 的 列 表 中 包 含 链 接 器 为 了 解 析 引 用 而 扫 描 的 所 有 库 。有 关 库 变 体 的 详 细 信 息 , 请 参 阅 《 库 和 浮 点 支 持 指 南 》 中 的 第 2 章 C 和 C++ 库 。7-4 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 <strong>ARM</strong> 库 管 理 程 序7.2.2 搜 索 用 户 库您 可 以 按 下 述 方 法 指 定 用 户 库 :• 将 其 明 确 包 含 在 输 入 文 件 列 表 中• 将 --userlibpath 选 项 添 加 到 armlink 命 令 行 , 并 在 命 令 行 中 包 含 以 逗 号 分 隔的 目 录 列 表 和 作 为 输 入 文 件 的 库 的 名 称 。如 果 未 在 命 令 行 中 指 定 库 的 完 整 路 径 名 , 链 接 器 会 尝 试 在 --userlibpath 选 项 指定 的 目 录 中 查 找 库 。 例 如 , 如 果 目 录 /mylib 中 包 含 my_lib.a 和 other_lib.a, 则 使用 以 下 命 令 将 /mylib/my_lib.a 添 加 到 输 入 文 件 列 表 :armlink --userlibpath /mylib my_lib.a *.o如 果 从 库 中 添 加 一 个 特 定 成 员 , 则 不 会 将 库 添 加 到 链 接 器 使 用 的 可 搜 索 库 的 列表 中 。 要 加 载 特 定 成 员 并 将 库 添 加 到 可 搜 索 库 的 列 表 中 , 请 包 括 库 filename 本身 , 同 时 指 定 library(member)。 例 如 , 要 加 载 strcmp.o 并 将 mystring.lib 放 在 可 搜索 库 列 表 中 , 请 将 以 下 库 添 加 到 输 入 文 件 列 表 中 :mystring.lib(strcmp.o) mystring.lib注 意用 于 由 RVCT31LIB 环 境 变 量 或 链 接 器 命 令 行 选 项 --libpath 指 定 的 <strong>ARM</strong> 标 准 库 的搜 索 路 径 不 可 用 于 搜 索 用 户 库 ( 请 参 阅 第 7-4 页 的 搜 索 <strong>ARM</strong> 库 )。7.2.3 扫 描 库当 链 接 器 构 建 库 列 表 后 , 它 将 重 复 扫 描 列 表 中 的 每 个 库 以 解 析 引 用 。当 搜 索 所 有 目 录 , 选 择 最 适 合 的 库 变 体 并 将 它 们 添 加 到 库 列 表 之 后 , 将 扫 描 每 个库 以 加 载 所 需 的 成 员 :1. 对 于 每 个 当 前 未 满 足 的 非 弱 引 用 , 链 接 器 将 顺 序 搜 索 库 列 表 , 以 找 到 匹 配的 定 义 。 找 到 的 第 一 个 定 义 将 标 记 为 用 于 步 骤 2。如 果 两 个 或 更 多 个 库 定 义 了 同 一 个 符 号 , 则 搜 索 的 有 序 性 可 确 保 链 接 器 选择 列 表 中 较 早 出 现 的 库 。 这 样 可 以 覆 盖 其 他 库 中 的 函 数 定 义 , 例 如 , 通 过将 库 添 加 到 输 入 文 件 列 表 以 覆 盖 <strong>ARM</strong> C 库 。 但 是 , 您 必 须 谨 慎 , 在 覆 盖 库成 员 中 的 所 有 符 号 时 应 保 持 一 致 , 否 则 行 为 将 不 可 预 测 。2. 加 载 步 骤 1 中 标 记 的 库 成 员 。 加 载 每 个 成 员 时 , 它 可 能 满 足 某 些 未 解 析 的引 用 ( 也 许 包 括 弱 引 用 )。 加 载 库 也 可 能 会 创 建 新 的 未 解 析 “ 弱 ” 和 “ 非弱 ” 引 用 。3. 继 续 步 骤 1 和 2 中 的 过 程 , 直 到 所 有 非 弱 引 用 都 被 解 析 , 或 者 不 能 被 任 何库 解 析 。如 果 任 何 非 弱 引 用 在 扫 描 操 作 结 束 时 仍 然 未 满 足 , 则 链 接 器 将 生 成 错 误 消 息 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 7-5


使 用 <strong>ARM</strong> 库 管 理 程 序7.3 <strong>ARM</strong> 库 管 理 程 序<strong>ARM</strong> 库 管 理 程 序 armar 可 使 多 组 ELF 目 标 文 件 或 库 集 中 到 一 起 并 保 留 在 库 中 。可 以 将 此 类 库 传 送 到 链 接 器 , 以 代 替 多 个 目 标 文 件 。 但 是 , 链 接 对 象 库 文 件 生 成的 结 果 不 一 定 与 链 接 所 有 集 中 到 对 象 库 文 件 中 的 目 标 文 件 生 成 的 结 果 相 同 。 这是 因 为 链 接 器 处 理 输 入 列 表 和 库 的 方 式 不 同 :• 尽 管 指 定 armlink --remove 选 项 后 将 删 除 未 使 用 区 , 但 是 输 入 列 表 中 的 每 个目 标 文 件 都 将 无 条 件 地 出 现 在 输 出 中 。• 仅 当 目 标 文 件 或 前 面 处 理 的 库 文 件 引 用 了 库 文 件 的 成 员 时 , 该 成 员 才 包 含在 输 出 中 。有 关 链 接 器 如 何 处 理 输 入 文 件 的 详 细 信 息 , 请 参 阅 第 2 章 链 接 器 命 令 语 法 。7.3.1 库 管 理 程 序 命 令 行 选 项用 于 添 加 或 修 改 库 中 的 文 件 的 armar 命 令 语 法 是 :armar --help [--create] [--diag_style arm|ide|gnu] [--[no_]project=[filename]][--reinitialize_workdir] [--workdir=directory] [-c] [-d] [-m] [-q] [-r] [-u] [--vsn] [-v][--via option_file] [{-a|-b|-i} pos_name] library [file_list]用 于 提 取 文 件 或 库 信 息 的 armar 命 令 语 法 是 :armar [--help] [--diag_style arm|ide|gnu] [-C] [--entries] [-p] [-t] [-s] [--sizes][-T] [--vsn] [-v] [--via option_file] [-x] [--zs] [--zt] library [file_list]其 中 :- a 将 新 文 件 放 在 library 中 文 件 pos_name 的 后 面 。如 果 在 相 同 的 命 令 行 上 包 括 -b( 或 -i), 则 否 定 此 选 项 的 作 用 。- b 将 新 文 件 放 在 library 中 文 件 pos_name 的 前 面 。如 果 在 相 同 的 命 令 行 上 包 括 -a, 则 此 选 项 优 先 执 行 。- i 将 新 文 件 放 在 library 中 成 员 pos_name 的 前 面 ( 相 当 于 -b)。如 果 在 相 同 的 命 令 行 上 包 括 -a, 则 此 选 项 优 先 执 行 。pos_name用 于 相 对 定 位 的 现 有 库 成 员 的 名 称 。 此 名 称 必 须 与 -a、- b 和 -i 选项 一 起 使 用 。- C 指 示 库 管 理 程 序 在 执 行 提 取 时 , 不 用 名 称 相 似 的 文 件 替 换 现 有 文件 。 当 同 时 使 用 -T 禁 止 用 截 断 的 文 件 名 替 换 具 有 相 同 前 缀 的 文 件时 , 此 选 项 很 有 用 。7-6 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 <strong>ARM</strong> 库 管 理 程 序- c 禁 止 产 生 在 创 建 库 时 通 常 写 入 标 准 错 误 的 诊 断 消 息 。--create 创 建 新 库 , 即 使 library 已 存 在 。- d 从 library 中 删 除 一 个 或 多 个 文 件 。--diag_style arm|ide|gnu更 改 警 告 和 错 误 消 息 的 格 式 。--diag_style arm 为 缺 省值 ,--diag_style gnu 与 由 gcc 报 告 的 格 式 相 匹 配 , 而 --diag_styleide 与 由 Microsoft Visual Studio 报 告 的 格 式 相 匹 配 。--entries 列 出 library 中 定 义 的 所 有 入 口 点 。 列 表 的 格 式 为 :ENTRY at offset num in section name of memberfile_list要 处 理 文 件 的 列 表 。 每 个 文 件 由 其 路 径 和 名 称 完 全 指 定 。 路 径 可 以是 绝 对 路 径 、 相 对 于 驱 动 器 和 根 的 路 径 , 或 者 相 对 于 当 前 目 录 的 路径 。当 与 库 中 的 文 件 名 进 行 比 较 时 , 仅 使 用 路 径 末 尾 的 文 件 名 。 如 果 两个 或 多 个 路 径 操 作 数 以 相 同 的 文 件 名 结 束 , 则 结 果 将 无 法 预 料 。 可以 使 用 通 配 符 * 和 ? 来 指 定 文 件 。如 果 其 中 一 个 文 件 是 库 , 则 armar 将 输 入 库 中 的 所 有 成 员 复 制 到 目标 库 。 命 令 行 中 的 条 目 顺 序 将 予 以 保 留 。 因 此 , 提 供 库 文 件 在 逻 辑上 相 当 于 按 成 员 在 库 中 存 储 的 顺 序 来 提 供 库 的 所 有 成 员 。--help 提 供 armar 命 令 的 帮 助 信 息 。--[no_]project=[filename]--reinitialize_workdir--workdir=directory启 用 或 禁 用 工 程 模 板 文 件 的 使 用 。 有 关 详 细 信 息 , 请 参 阅 《 编 译 器参 考 指 南 》 中 的 第 2-75 页 的 --[no_]project=filename。可 用 于 重 新 初 始 化 工 程 模 板 工 作 目 录 。 有 关 详 细 信 息 , 请 参 阅 《 编译 器 参 考 指 南 》 中 的 第 2-78 页 的 --reinitialize_workdir。可 用 于 提 供 工 程 模 板 的 工 作 目 录 。 有 关 详 细 信 息 , 请 参 阅 《 编 译 器参 考 指 南 》 中 的 第 2-96 页 的 --workdir=directory。library 库 文 件 的 路 径 名 。- m 移 动 文 件 。 如 果 指 定 了 带 有 pos_name 的 -a、- b 或 -i, 则 文 件 将 移 动到 新 位 置 。 否 则 , 文 件 将 移 到 库 的 末 尾 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 7-7


使 用 <strong>ARM</strong> 库 管 理 程 序- n 禁 止 归 档 符 号 表 。 当 库 不 是 对 象 库 时 使 用 它 。- p 将 library 中 的 文 件 内 容 输 出 到 stdout。- q - r 的 别 名 。- r 在 library 中 替 换 或 添 加 文 件 。 如 果 library 不 存 在 , 则 创 建 一 个 新的 库 文 件 并 将 诊 断 消 息 写 入 标 准 错 误 。如 果 未 指 定 file_list 而 库 存 在 , 则 结 果 将 无 法 预 料 。 替 换 现 有 文件 的 文 件 不 会 更 改 库 的 顺 序 。如 果 使 用 -u 选 项 , 则 只 替 换 修 改 日 期 晚 于 库 文 件 的 那 些 文 件 。如 果 使 用 -a、- b 或 -i 选 项 , 则 pos_name 必 须 存 在 并 指 定 是 将 新 文 件放 在 pos_name 之 后 (- a) 还 是 之 前 (- b 或 -i)。 否 则 新 文 件 将 放 在 末尾 。- t 输 出 library 的 内 容 表 。 由 file_list 指 定 的 文 件 将 包 含 在 写 入 列 表中 。 如 果 未 指 定 file_list, 则 按 归 档 顺 序 包 含 库 中 的 所 有 文 件 。- s 重 新 生 成 归 档 符 号 表 。--sizes列 出 了 library 中 每 个 成 员 的 Code、RO Data、RW Data、ZI Data 和 Debug的 大 小 , 例 如 :Code RO Data RW data ZI Data Debug Object Name464 0 0 0 8612 app_1.o3356 0 0 10244 11848 app_2.o3820 0 0 10244 20460 TOTAL- T 允 许 截 断 已 提 取 文 件 的 文 件 名 ( 如 果 其 库 名 长 度 超 过 文 件 系 统 能 够支 持 的 长 度 )。 缺 省 情 况 下 , 提 取 文 件 名 过 长 的 文 件 时 会 出 错 。 系统 将 写 入 一 个 诊 断 消 息 , 并 且 不 提 取 该 文 件 。- u 更 新 旧 文 件 。 与 -r 选 项 结 合 使 用 时 , 只 有 当 相 应 文 件 的 修 改 时 间不 晚 于 库 中 文 件 的 修 改 时 间 时 , 才 替 换 library 中 的 文 件 。--via option_file指 示 库 管 理 程 序 使 用 option_file 中 的 选 项 。 有 关 编 写 via 文 件 的 详细 信 息 , 请 参 阅 《 编 译 器 参 考 指 南 》 中 的 第 A-2 页 的 via 文 件 概 述 。- v 提 供 冗 余 输 出 。7-8 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 <strong>ARM</strong> 库 管 理 程 序输 出 随 使 用 的 其 他 选 项 而 变 化 :- d、-r 和 -x写 入 有 关 库 创 建 、 组 成 文 件 和 维 护 活 动 的 各 个 文 件 的 详细 描 述 。- p 将 文 件 本 身 写 入 stdout 之 前 , 将 文 件 名 写 入 标 准 输 出 。- t 包 含 有 关 库 中 文 件 信 息 的 长 列 表 。- x 在 每 次 提 取 之 前 输 出 文 件 名 。--vsn 输 出 有 关 标 准 错 误 的 版 本 号 。- x 从 library 提 取 file_list 中 的 文 件 。 library 的 内 容 不 会 发 生 更 改 。如 果 未 提 供 文 件 操 作 数 , 则 提 取 library 中 的 所 有 文 件 。 如 果 从 库中 提 取 的 文 件 的 文 件 名 比 目 标 目 录 中 支 持 的 文 件 名 长 , 则 结 果 将 无法 预 料 。--zs 显 示 符 号 表 。--zt列 出 library 中 的 成 员 大 小 和 入 口 点 。 有 关 输 出 格 式 的 信 息 , 请 参阅 --sizes 和 --entries。注 意普 通 操 作 不 需 要 -a、- b、- C、- i、- m、- T、- u 和 -v 选 项 。与 库 顺 序 相 关 的 选 项 ( 例 如 ,- a、- b、- i 和 -m) 之 间 是 不 相 关 的 , 因 为 <strong>ARM</strong> 工 具不 能 使 用 没 有 符 号 表 的 库 。 如 果 有 符 号 表 , 则 顺 序 是 不 相 关 的 。 不 过 , 如 果 在 相同 命 令 行 上 包 括 -a 和 -b( 或 -i), 请 参 阅 优 先 级 的 规 则 。使 用 与 库 更 新 相 关 的 选 项 (- C 和 -u) 的 机 会 不 多 , 因 为 在 实 际 应 用 中 , 通 常 是 重建 库 , 而 不 是 更 新 库 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 7-9


使 用 <strong>ARM</strong> 库 管 理 程 序7.3.2 排 序 命 令 行 选 项通 常 , 命 令 行 选 项 可 以 按 任 意 顺 序 出 现 。 不 过 , 一 些 选 项 的 效 果 取 决 于 它 们 如 何与 其 他 相 关 选 项 组 合 。如 果 选 项 在 相 同 的 命 令 行 上 覆 盖 先 前 的 选 项 , 则 最 后 的 选 项 将 优 先 执 行 。 如 果某 个 选 项 不 遵 循 该 规 则 , 则 在 说 明 中 予 以 指 明 。 使 用 --show_cmdline 选 项 可 查 看库 管 理 程 序 如 何 处 理 命 令 行 。 命 令 以 标 准 化 方 式 显 示 , 并 且 所 有 via 文 件 的 内 容将 进 行 扩 展 。注 意在 当 前 版 本 的 RVCT 中 ,armar 命 令 行 选 项 必 须 以 - 开 头 。 这 是 对 先 前 版 本 的 一个 更 改 。7.3.3 armar 使 用 示 例示 例 7-1 至 第 7-11 页 的 示 例 7-8 中 显 示 了 语 法 示 例 。示 例 7-1 创 建 新 库 并 添 加 所 有 目 标 文 件armar --create mylib *.o示 例 7-2 列 出 内 容 表 ( 冗 余 )armar -tv mylib示 例 7-3 列 出 符 号 表armar --zs mylib示 例 7-4 添 加 ( 或 替 换 ) 文 件armar -r mylib obj1.o obj2.o obj3.o ...armar -ru mylib k*.o7-10 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 <strong>ARM</strong> 库 管 理 程 序示 例 7-5 在 指 定 位 置 添 加 ( 或 替 换 ) 文 件armar -r -a obj2.o mylib obj3.o obj4.o ...示 例 7-6 提 取 一 组 文 件armar -x mylib k*.o示 例 7-7 删 除 一 组 文 件armar -d mylib sys_*示 例 7-8 合 并 库 并 添 加 ( 或 替 换 ) 文 件armar -r mylib my_lib.a other_lib.a obj1.o obj2.o obj3.o<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 7-11


使 用 <strong>ARM</strong> 库 管 理 程 序7-12 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


第 8 章使 用 fromelf本 章 介 绍 了 随 RVCT 提 供 的 <strong>ARM</strong> fromelf 实 用 软 件 。 它 包 含 以 下 几 节 :• 第 8-2 页 的 关 于 fromelf• 第 8-3 页 的 fromelf 命 令 语 法• 第 8-13 页 的 fromelf 使 用 示 例<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 8-1


使 用 fromelf8.1 关 于 fromelffromelf 将 <strong>ARM</strong> 链 接 器 生 成 的 ELF 映 像 转 换 为 适 合 ROM 工 具 的 其 他 格 式 , 并 将它 们 直 接 加 载 到 内 存 中 。 您 还 可 以 使 用 fromelf 显 示 关 于 ELF 对 象 的 各 种 信 息 ,或 生 成 包 含 这 些 信 息 的 文 本 文 件 。fromelf 输 出 以 下 映 像 格 式 :• 无 格 式 二 进 制• Motorola 32 位 S-record• Intel Hex-32• 面 向 字 节 (Verilog 内 存 模 型 ) 的 十 六 进 制 格 式• ELF。 可 将 其 重 新 保 存 为 ELF, 例 如 , 您 可 将 调 试 ELF 映 像 转 换 为 非 调 试ELF 映 像 。fromelf 还 可 以 将 输 入 文 件 的 信 息 ( 例 如 , 反 汇 编 输 出 或 符 号 列 表 ) 输 出 到 stdout或 文 本 文 件 。8.1.1 映 像 结 构fromelf 可 以 将 文 件 从 ELF 格 式 转 换 为 其 他 格 式 。 除 了 可 以 使 用 --base 选 项 改 变Motorola S-record 或 Intel Hex 输 出 的 基 址 之 外 , 它 不 能 更 改 映 像 的 结 构 或 地 址 。不 能 将 分 散 加 载 的 ELF 映 像 更 改 为 另 一 格 式 的 非 分 散 加 载 映 像 。 链 接 时 必 须 向链 接 器 提 供 任 何 结 构 或 寻 址 信 息 。8.1.2 排 序 命 令 行 选 项通 常 , 命 令 行 选 项 可 以 按 任 意 顺 序 出 现 。 不 过 , 一 些 选 项 的 效 果 取 决 于 它 们 如 何与 其 他 相 关 选 项 组 合 。如 果 选 项 在 相 同 的 命 令 行 上 覆 盖 先 前 的 选 项 , 则 最 后 的 选 项 将 优 先 执 行 。 如 果某 个 选 项 不 遵 循 该 规 则 , 则 在 说 明 中 予 以 指 明 。 使 用 --show_cmdline 选 项 可 以 查看 fromelf 如 何 处 理 命 令 行 。 命 令 以 标 准 化 方 式 显 示 , 并 且 所 有 via 文 件 的 内 容将 进 行 扩 展 。8-2 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 fromelf8.2 fromelf 命 令 语 法本 节 介 绍 了 fromelf 命 令 的 语 法 和 选 项 。以 下 是 调 用 fromelf 的 命 令 :fromelf [--base n] [--debugonly] [--diag_style arm|ide|gnu][--diag_suppress taglist] [--expandarrays] [--fieldoffsets[--select select_options ]] --help [--no_debug] [--no_linkview][--no_symbolversions] [memory_config] [--privacy ] [project-template-options][--strip option] [--text | code_output_format] [--vsn] [--output output_file]input_file8.2.1 --base n指 定 Motorola S-record 和 Intel Hex 文 件 格 式 的 输 出 基 址 。 仅 当 将--m32、--m32combined、--i32 或 --i32combined 指 定 为 输 出 格 式 时 , 此 选 项 才 可 用 。可 以 将 基 址 指 定 为 下 面 任 意 一 种 :• 十 进 制 值 , 例 如 --base 0• 十 六 进 制 值 , 例 如 --base 0x8000。输 出 文 件 中 编 码 的 所 有 地 址 都 从 基 址 n 开 始 。 如 果 未 指 定 --base 选 项 , 则 从 载 入区 地 址 获 取 基 址 。注 意如 果 有 多 个 载 入 区 , 则 --base 值 将 用 于 每 个 输 出 文 件 。 即 , 它 覆 盖 所 有 载 入 区 地址 。8.2.2 code_output_format选 择 二 进 制 或 ELF 输 出 文 件 选 项 。code_output_format 可 以 是 以 下 之 一 :--bin--elf--i32无 格 式 二 进 制 。 可 以 使 用 memory_config 选 项 将 此 选 项 的 输 出 分 为多 个 文 件 。ELF 格 式 ( 重 新 保 存 为 ELF)。 这 可 用 于 将 调 试 ELF 映 像 转 换 为 非调 试 ELF 映 像 。Intel Hex-32 格 式 。 此 选 项 为 映 像 中 的 每 个 载 入 区 生 成 一 个 输 出 文件 。 可 以 使 用 --base 选 项 指 定 输 出 的 基 址 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 8-3


使 用 fromelf--i32combinedIntel Hex-32 格 式 。 此 选 项 为 包 含 多 个 载 入 区 的 映 像 生 成 一 个 输 出文 件 。 可 以 使 用 --base 选 项 指 定 输 出 的 基 址 。--m32Motorola 32 位 格 式 (32 位 S-record)。 此 选 项 为 映 像 中 的 每 个 载 入区 生 成 一 个 输 出 文 件 。 可 以 使 用 --base 选 项 指 定 输 出 的 基 址 。--m32combinedMotorola 32 位 格 式 (32 位 S-record)。 此 选 项 为 包 含 多 个 载 入 区 的映 像 生 成 一 个 输 出 文 件 。 可 以 使 用 --base 选 项 指 定 输 出 的 基 址 。--vhx面 向 字 节 (Verilog 内 存 模 型 ) 的 十 六 进 制 格 式 。 此 格 式 适 合 载 入 到硬 件 描 述 语 言 (HDL) 模 拟 器 的 内 存 模 型 中 。 可 以 使 用 memory_config选 项 将 此 选 项 的 输 出 分 为 多 个 文 件 。如 果 使 用 fromelf 以 及 --bin、--m32、--i32 或 --vhx 选 项 之 一 将 包 含 多 个 载 入 区 的ELF 映 像 转 换 为 二 进 制 格 式 , 则 fromelf 会 创 建 一 个 名 为 output_file 的 输 出 目录 , 并 且 为 输 入 映 像 中 的 每 个 载 入 区 生 成 一 个 二 进 制 输 出 文 件 。fromelf 将 输 出文 件 放 在 output_file 目 录 中 。注 意对 于 多 个 载 入 区 , 将 对 应 载 入 区 中 的 第 一 个 非 空 执 行 区 的 名 称 用 作 文 件 名 。如 果 使 用 --m32combined 或 --i32combined 选 项 转 换 包 含 多 个 载 入 区 的 ELF 映 像 ,则 fromelf 会 创 建 一 个 名 为 output_file 的 输 出 目 录 , 并 为 输 入 映 像 中 的 所 有 载 入区 生 成 一 个 二 进 制 输 出 文 件 , 然 后 将 输 出 文 件 放 在 output_file 目 录 中 。例 如 , 如 果 用 定 义 多 个 载 入 区 的 分 散 加 载 描 述 文 件 构 建 ELF 映 像 , 则 映 像 会 包含 多 个 载 入 区 。另 请 参 阅• 第 8-3 页 的 --base n• 第 8-9 页 的 --output output_file.8.2.3 --continue_on_error此 选 项 将 所 有 可 恢 复 错 误 降 级 为 警 告 , 以 便 fromelf 可 以 处 理 损 坏 的 ELF 文 件 。8-4 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 fromelf8.2.4 --decode_build_attributes对 于 标 准 构 建 属 性 , 构 建 属 性 节 的 内 容 将 以 可 阅 读 的 格 式 输 出 ; 对 于 非 标 准 构建 属 性 , 构 建 属 性 节 的 内 容 将 以 原 始 十 六 进 制 格 式 输 出 。8.2.5 --debugonly将 此 选 项 与 --elf 结 合 使 用 可 删 除 任 何 代 码 或 数 据 节 的 内 容 。 使 用 此 选 项 可 使 输出 文 件 中 仅 包 含 调 试 所 需 的 信 息 , 例 如 , 调 试 节 、 符 号 表 和 字 符 串 表 。由 于 需 要 将 节 的 头 文 件 作 为 符 号 的 目 标 使 用 , 因 此 将 保 留 节 的 头 文 件 。此 选 项 只 影 响 ELF 输 出 文 件 。8.2.6 --diag_style arm|ide|gnu更 改 警 告 和 错 误 消 息 的 格 式 。--diag_style arm 为 缺 省 值 ,--diag_style gnu 与 由gcc 报 告 的 格 式 相 匹 配 , 而 --diag_style ide 与 由 Microsoft Visual Studio 报 告 的 格式 相 匹 配 。8.2.7 --diag_suppress taglist禁 用 所 有 具 有 指 定 标 签 的 诊 断 消 息 。此 选 项 需 要 以 逗 号 分 隔 的 列 表 来 标 识 要 禁 止 显 示 的 消 息 的 编 号 ( 可 以 指 定 多 个标 签 )。 例 如 , 要 禁 止 显 示 编 号 为 1293 和 187 的 警 告 消 息 , 请 使 用 以 下 命 令 :fromelf --diag_suppress 1293,187 ...禁 止 显 示 消 息 时 可 使 用 fromelf 前 缀 Q, 例 如 :fromelf --diag_suppress Q1293,Q187 ...使 用 前 缀 字 母 是 可 选 的 。 但 是 , 如 果 包 含 了 前 缀 字 母 , 则 它 必 须 与 fromelf 标 识字 母 相 匹 配 。 如 果 找 到 了 其 他 前 缀 , 则 忽 略 消 息 编 号 。8.2.8 --dump_build_attributes以 原 始 十 六 进 制 格 式 输 出 构 建 属 性 节 的 内 容 , 即 使 用 与 数 据 相 同 的 格 式 。8.2.9 --expandarrays输 出 数 据 地 址 , 包 括 在 结 构 内 外 展 开 的 数 组 。此 选 项 只 能 与 --text -a 结 合 使 用 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 8-5


使 用 fromelf8.2.10 --extract_build_attributes对 于 标 准 构 建 属 性 , 仅 以 可 阅 读 的 格 式 输 出 构 建 属 性 ; 对 于 非 标 准 构 建 属 性 , 仅以 原 始 十 六 进 制 格 式 输 出 构 建 属 性 。8.2.11 --fieldoffsets输 出 汇 编 语 言 EQU 指 令 的 列 表 , 这 些 指 令 将 C++ 类 或 C 结 构 的 字 段 名 视 为 等 同于 类 或 结 构 的 基 址 的 相 应 偏 移 。 输 入 ELF 文 件 可 以 是 可 重 定 位 对 象 或 映 像 。使 用 -o 将 输 出 重 定 向 到 文 件 。 使 用 armasm 的 INCLUDE 命 令 加 载 生 成 的 文 件 , 并 按汇 编 语 言 的 名 称 提 供 对 C++ 类 和 C 结 构 成 员 的 访 问 。 有 关 armasm 的 详 细 信 息 ,请 参 阅 汇 编 程 序 指 南 。注 意以 下 选 项 :• 在 源 文 件 没 有 调 试 信 息 的 情 况 下 不 可 用• 不 能 与 code_output_format 结 合 使 用 。此 选 项 输 出 所 有 结 构 信 息 。 要 输 出 结 构 的 子 集 , 请 使 用 --select select_options。如 果 不 需 要 可 以 输 入 到 armasm 的 文 件 , 则 使 用 --text -a 选 项 , 将 显 示 的 地 址 设置 为 易 于 阅 读 的 格 式 。 -a 选 项 只 输 出 结 构 的 地 址 信 息 和 映 像 中 的 静 态 数 据 , 因为 地 址 在 可 重 定 位 对 象 中 是 未 知 的 。注 意如 果 需 要 fromelf --fieldoffsets 步 骤 , 则 不 要 使 用 --no_debug。 如 果 生 成 的 映 像没 有 调 试 信 息 , 则 fromelf 无 法 :• 将 映 像 转 换 为 其 他 文 件 格 式• 生 成 有 意 义 的 反 汇 编 列 表 。8.2.12 --help显 示 帮 助 和 使 用 信 息 。 如 果 指 定 此 选 项 , 则 忽 略 其 他 命 令 行 选 项 。 调 用 不 带 任何 参 数 的 fromelf 将 生 成 相 同 的 帮 助 信 息 。8.2.13 input_file指 定 要 转 换 的 ELF 文 件 。8-6 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 fromelffromelf 只 接 受 <strong>ARM</strong> 可 执 行 ELF 文 件 和 <strong>ARM</strong> 对 象 ELF 文 件 (.o)。 如 果input_file 是 包 含 多 个 载 入 区 的 分 散 加 载 映 像 , 并 且 输 出 格 式 是--bin、--m32、--i32 或 --vhx 之 一 , 则 fromelf 会 为 每 个 载 入 区 创 建 一 个 单 独 的 文件 。如 果 input_file 是 包 含 多 个 载 入 区 的 分 散 加 载 映 像 , 并 且 输 出 格 式 是--m32combined 或 --i32combined, 则 fromelf 会 创 建 一 个 包 含 所 有 载 入 区 的 文 件 。8.2.14 memory_config为 多 个 存 储 体 输 出 多 个 文 件 。memory_config 的 格 式 为 --widthxbanks, 其 中 :banks 指 定 目 标 内 存 系 统 中 存 储 体 的 数 量 。width 是 目 标 内 存 系 统 中 的 内 存 宽 度 (8 位 、16 位 、32 位 或 64 位 )。有 效 配 置 有 :--8x1--8x2--8x4--16x1--16x2--32x1--32x2--64x1如 果 指 定 了 多 个 配 置 , 则 fromelf 使 用 最 后 指 定 的 配 置 。如 果 映 像 有 一 个 载 入 区 , 则 fromelf 生 成 banks 文 件 , 并 按 以 下 约 定 进 行 命 名 :• 如 果 有 一 个 存 储 体 (banks=1), 则 输 出 文 件 根 据 -o output_file 自 变 量 进 行命 名 。• 如 果 有 多 个 存 储 体 (banks>1), 则 fromelf 生 成 banks 个 文 件 , 其 名 称 从output_file0 开 始 , 到 output_file banks-1 结 束 。 例 如 :fromelf --vhx --8x2 test.axf -o test生 成 两 个 名 为 test0 和 test1 的 文 件 。如 果 映 像 有 多 个 载 入 区 , 则 fromelf 创 建 一 个 名 为 output_file 的 目 录 , 并 且 为 每个 载 入 区 生 成 bank 文 件 , 其 名 称 从 load region0 到 load region banks-1。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 8-7


使 用 fromelf由 width 指 定 的 内 存 宽 度 控 制 从 映 像 读 取 并 写 入 文 件 的 信 息 块 大 小 。 读 取 的 第 一个 块 分 配 到 第 一 个 文 件 (output_file0), 第 二 个 块 分 配 到 第 二 个 文 件 。 将 一 个 块分 配 到 最 后 一 个 文 件 之 后 , 重 新 从 第 一 个 文 件 开 始 分 配 ( 即 , 分 配 以 文 件 数 量 为模 )。 例 如 :对 于 --8x4 的 memory_configbyte0 -> file0byte1 -> file1byte2 -> file2byte3 -> file3byte4 -> file0Ö对 于 --16x2 的 memory_confighalfword0 -> file0halfword1 -> file1halfword3 -> file0Ö8.2.15 --no_debug不 要 将 调 试 信 息 放 在 输 出 文 件 中 。 这 是 二 进 制 映 像 的 缺 省 设 置 。 如 果 指 定 了--no_debug, 则 影 响 所 有 输 出 格 式 。 它 覆 盖 --text -g 选 项 。注 意如 果 在 命 令 行 上 未 指 定 --elf, 则 此 选 项 可 能 会 产 生 意 外 的 结 果 。 因 为 没 有 指 定输 出 格 式 , 所 以 以 下 命 令 将 生 成 一 个 文 本 文 件 :fromelf --no_debug image -o image_nodb.axf要 获 取 ELF 格 式 的 输 出 , 请 使 用 选 项 :fromelf --no_debug --elf image.axf -o image_ndb.axf8-8 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 fromelf8.2.16 --no_linkview丢 弃 ELF 映 像 中 节 级 别 的 视 图 , 只 保 留 段 级 别 的 视 图 ( 加 载 时 视 图 )。 丢 失 链 接视 图 的 节 级 别 时 将 删 除 :• 节 的 头 文 件 表• 节 的 头 文 件 字 符 串 表• 字 符 串 表• 符 号 表• 所 有 调 试 节 。输 出 中 只 保 留 程 序 的 头 文 件 表 和 程 序 段 。 根 据 ELF 规 范 , 程 序 加 载 程 序 在 ELF文 件 中 能 够 依 赖 就 是 这 些 内 容 。注 意如 果 在 命 令 行 上 未 指 定 --elf, 则 此 选 项 可 能 会 产 生 意 外 的 结 果 。 要 获 取 ELF 格式 的 输 出 , 请 使 用 选 项 :fromelf --no_linkview --elf image.axf -o image_nlk.axf8.2.17 --no_symbolversions关 闭 符 号 版 本 表 的 解 码 功 能 。 有 关 详 细 信 息 , 请 参 阅 第 4-22 页 的 符 号 版 本 控 制和 BPABI。8.2.18 --output output_file指 定 输 出 文 件 的 名 称 , 或 在 创 建 多 个 输 出 文 件 时 指 定 输 出 目 录 的 名 称 。 对 于--text 输 出 选 项 , 可 以 选 择 是 否 指 定 输 出 文 件 ; 但 对 于 所 有 其 他 输 出 选 项 , 必 须指 定 输 出 文 件 。另 请 参 阅• 第 8-3 页 的 code_output_format• 第 8-12 页 的 --text.8.2.19 --privacy将 节 名 更 改 为 缺 省 值 , 同 时 设 置 --strip symbols。 此 外 , 除 映 射 和 构 建 属 性 符 号之 外 , 所 有 本 地 符 号 均 失 去 其 名 称 。例 如 , 代 码 节 的 名 称 将 更 改 为 .text。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 8-9


使 用 fromelf8.2.20 Project template options工 程 模 板 是 包 含 工 程 信 息 的 文 件 , 如 用 于 特 定 配 置 的 命 令 行 选 项 。 这 些 文 件 存储 在 工 程 模 板 工 作 目 录 中 。 以 下 选 项 控 制 工 程 模 板 的 使 用 。--[no_]project=[filename]--reinitialize_workdir--workdir=directory启 用 或 禁 用 工 程 模 板 文 件 的 使 用 。可 用 于 重 新 初 始 化 工 程 模 板 工 作 目 录 。可 用 于 提 供 工 程 模 板 的 工 作 目 录 。有 关 这 些 选 项 的 详 细 信 息 , 请 参 阅 :• 《 编 译 器 参 考 指 南 》 中 的 第 2-75 页 的 --[no_]project=filename• 《 编 译 器 参 考 指 南 》 中 的 第 2-78 页 的 --reinitialize_workdir• 《 编 译 器 参 考 指 南 》 中 的 第 2-96 页 的 --workdir=directory。8.2.21 --select select_options将 此 选 项 与 --fieldoffsets 或 --text -a 结 合 使 用 , 可 选 择 输 出 或 显 示 只 与 选 项 列表 中 的 模 式 匹 配 的 那 些 字 段 。使 用 特 殊 字 符 选 择 多 个 字 段 :• 使 用 逗 号 (,) 将 列 表 中 的 选 项 组 合 在 一 起 , 例 如 :a*,b*,c*。• 可 以 使 用 通 配 符 * 来 匹 配 任 意 名 称 。• 可 以 使 用 通 配 符 ? 来 匹 配 任 意 单 个 字 母 。• 通 过 在 select_options 字 符 串 前 面 加 + 来 指 定 要 包 括 的 字 段 。 这 是 缺 省 设置 。• 通 过 在 select_options 字 符 串 前 面 加 ~ 来 指 定 要 排 除 的 字 段 。如 果 在 Unix 平 台 上 使 用 特 殊 字 符 , 则 必 须 将 选 项 括 在 引 号 内 , 防 止 shell 扩 展 选择 范 围 。8.2.22 --show_cmdline显 示 fromelf 如 何 处 理 命 令 行 。 命 令 以 标 准 化 方 式 显 示 , 并 且 所 有 via 文 件 的 内容 将 进 行 扩 展 。8-10 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 fromelf8.2.23 --strip option [, option]保 护 映 像 中 的 IP 和 传 递 到 第 三 方 的 对 象 。其 中 option 为 下 列 项 之 一 :all对 于 对 象 模 块 , 此 选 项 从 ELF 文 件 中 删 除 所 有 调 试 、 注 释 、 说 明 和符 号 。对 于 可 执 行 文 件 , 此 选 项 与 --nolinkview 作 用 相 同 。 有 关 详 细 信息 , 请 参 阅 第 8-9 页 的 --no_linkview。debug 从 ELF 文 件 中 删 除 所 有 调 试 节 。 它 与 现 有 的 --no_debug 选 项 同 义 。comment从 ELF 文 件 中 删 除 .comment 节 。 它 与 现 有 的 --no_comment_section选 项 同 义 。filesymbols 从 ELF 文 件 中 删 除 STT_FILE 符 号 。notes 从 ELF 文 件 中 删 除 .notes 节 。pathnamessymbols从 所 有 类 型 为 STT_FILE 的 符 号 中 删 除 路 径 信 息 。 例 如 , 将 名 为C:\work\myobject.o 的 STT_FILE 符 号 重 命 名 为 myobject.o。对 于 对 象 , 此 选 项 从 不 用 作 重 定 位 目 标 的 ELF 文 件 中 删 除 所 有 局 部符 号 。对 于 可 执 行 文 件 , 此 选 项 删 除 所 有 静 态 符 号 。 如 果 将 这 些 静 态 符 号的 任 意 一 个 用 作 静 态 重 定 位 目 标 , 则 这 些 重 定 位 将 丢 失 。在 所 有 情 况 下 , 均 删 除 STT_FILE 符 号 。注 意去 除 符 号 、 路 径 名 或 文 件 符 号 可 能 会 使 调 试 更 为 困 难 。如 果 没 有 输 出 --elf, 则 --strip 没 有 效 果 。<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 8-11


使 用 fromelf8.2.24 --text以 文 本 格 式 输 出 映 像 信 息 。 使 用 此 选 项 可 以 对 ELF 映 像 或 ELF 目 标 文 件 进 行 解码 。 这 是 缺 省 值 , 即 如 果 没 有 指 定 代 码 输 出 格 式 , 则 假 定 使 用 --text。如 果 没 有 使 用 -o 选 项 指 定 output_file, 则 在 stdout 中 显 示 信 息 。使 用 以 下 一 个 或 多 个 选 项 指 定 显 示 的 内 容 :- a 输 出 全 局 和 静 态 数 据 地 址 ( 包 括 结 构 和 联 合 内 容 的 地 址 )。 此 选 项只 能 用 于 包 含 调 试 信 息 的 文 件 。 使 用 --select 选 项 可 以 输 出 数 据 地址 的 子 集 。如 果 要 查 看 在 结 构 内 外 展 开 的 数 组 的 数 据 地 址 , 请 使 用 带 此 文 本 类别 的 --expandarrays 选 项 。- c 对 代 码 进 行 反 汇 编 。- d 输 出 数 据 节 的 内 容 。- e 解 码 对 象 的 异 常 表 信 息 。 对 映 像 进 行 反 汇 编 时 与 -c 结 合 使 用 。- g 输 出 调 试 信 息 。- r 输 出 重 定 位 信 息 。- s 输 出 符 号 表 和 版 本 控 制 表 。- t 输 出 字 符 串 表 。- v 输 出 映 像 的 每 个 段 和 节 的 头 文 件 的 详 细 信 息 。- y 输 出 动 态 段 内 容 。- z 输 出 代 码 和 数 据 大 小 。 有 关 详 细 信 息 , 请 参 阅 第 3-31 页 的 获 得 有 关映 像 的 信 息 。只 有 选 择 了 --text 输 出 格 式 后 , 才 能 识 别 这 些 选 项 。8.2.25 --vsn显 示 fromelf 版 本 信 息 。8-12 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC


使 用 fromelf8.3 fromelf 使 用 示 例本 节 包 含 使 用 fromelf 来 更 改 映 像 格 式 或 从 ELF 文 件 提 取 信 息 的 示 例 。注 意如 果 在 Unix 平 台 上 使 用 通 配 符 ( 例 如 *、? 或 ~), 则 必 须 将 这 些 选 项 括 在 引 号内 , 防 止 shell 扩 展 选 择 范 围 。例 如 , 输 入 í*, ~*.*í 代 替 *, ~*.*。8.3.1 生 成 无 格 式 二 进 制 文 件要 将 ELF 文 件 转 换 为 无 格 式 二 进 制 (.bin) 文 件 , 请 使 用 :fromelf --bin -o outfile.bin infile.axf8.3.2 反 汇 编要 生 成 输 出 到 stdout 的 列 表 , 其 中 包 含 ELF 文 件 的 反 汇 编 版 本 , 请 使 用 :fromelf -c infile.axf要 生 成 包 含 ELF 文 件 和 符 号 表 的 反 汇 编 版 本 的 纯 文 本 输 出 文 件 , 请 使 用 :fromelf -c -s -o outfile.lst infile.axf8.3.3 以 汇 编 语 言 EQU 方 式 列 出 字 段 偏 移要 生 成 输 出 到 stdout 的 列 表 , 其 中 包 含 文 件 inputfile.o 中 所 有 结 构 的 全 部 字 段偏 移 , 请 使 用 :fromelf --fieldoffsets inputfile.o要 生 成 输 出 到 outputfile.a 的 文 件 列 表 , 其 中 包 含 文 件 inputfile.o 中 名 称 以 p 开头 的 结 构 的 所 有 字 段 偏 移 , 请 使 用 :fromelf --fieldoffsets --select p* -o outputfile.a inputfile.o要 生 成 输 出 到 outputfile.a 的 列 表 , 其 中 包 含 文 件 inputfile.o 中 名 为 tools 或moretools 的 结 构 的 所 有 字 段 偏 移 , 请 使 用 :fromelf --fieldoffsets --select tools.*, moretools.* -o outputfile.ainputfile.o<strong>ARM</strong> DUI 0349AC 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 8-13


使 用 fromelf要 生 成 输 出 到 outputfile.a 的 文 件 列 表 , 其 中 包 含 文 件 inputfile.o 中 名 称 以number 开 头 并 且 位 于 结 构 tools 的 结 构 字 段 top 中 的 结 构 字 段 的 所 有 字 段 偏 移 ,请 使 用 :fromelf --fieldoffsets --select tools.top.number* -o outputfile.a inputfile.o8.3.4 列 出 静 态 数 据 地 址要 在 stdout 中 列 出 所 有 全 局 和 静 态 数 据 变 量 以 及 所 有 结 构 字 段 地 址 , 请 使 用 :fromelf --text -a --select * infile.axf仅 选 择 结 构要 生 成 一 个 文 本 文 件 , 其 中 包 含 inputfile.axf 中 的 所 有 结 构 地 址 , 但 不 包 含 任 何全 局 或 静 态 数 据 变 量 信 息 , 请 使 用 :fromelf --text -a --select *.* -o strucaddress.txt infile.axf仅 选 择 嵌 套 结 构要 生 成 仅 包 含 嵌 套 结 构 的 地 址 的 文 本 文 件 , 请 使 用 :fromelf --text -a --select *.*.* -o strucaddress.txt infile.axf仅 选 择 变 量要 生 成 一 个 文 本 文 件 , 其 中 包 含 inputfile.axf 中 的 所 有 全 局 或 静 态 数 据 变 量 信息 , 但 不 包 含 任 何 结 构 地 址 , 请 使 用 :fromelf --text -a --select *, ~*.* -o strucaddress.txt infile.axf8.3.5 将 调 试 转 换 为 非 调 试要 生 成 一 个 新 的 输 出 文 件 , 该 文 件 等 同 于 从 ELF 文 件 ( 最 初 是 使 用 --debug 选 项生 成 的 ) 使 用 --no_debug 选 项 生 成 , 请 使 用 :fromelf --no_debug --elf -o outfile.axf infile.axf8-14 版 权 所 有 © 2007 <strong>ARM</strong> 公 司 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0349AC

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!