6

您如何从该程序中获取指向该程序内存的 .text 部分的指针?作为在后台运行的连续自检的一部分,我还需要该部分的长度来进行“闪存到内存”比较。

该工具集会自动为我正在使用的工具生成链接器 .cmd 文件,而我正在使用的板的板支持包要求我使用生成的 .cmd 文件而不是自己制作。(也没有制作文件来添加一个脚本来处理它。)

编辑:我正在使用代码编写器 3.1 环境使用 TI TMS 6713 DSP。我使用的卡是由我们的客户签约并由另一个组织生产的,所以我无法向您指出任何有关它的信息。然而,BSP 依赖于 TI 的“DSP BIOS”配置工具,如果不深入研究超出范围的工作,我真的无法过多地捏造设置。

4

4 回答 4

4

您需要将“变量”放在链接描述文件中。

在我的一个项目中,我的一个部分中有这个:

  __FlashStart = .;

在 C 程序中,我有这个:

extern unsigned long int _FlashStart;
unsigned long int address = (unsigned long int)&_FlashStart;
于 2008-10-14T20:00:15.860 回答
4

如果您可以修改链接描述文件,那肯定会更容易。由于您不能,因此可以从程序二进制文件中提取部分名称、地址和大小。例如,以下是使用 libbfd 检查所有代码段的方法。

#include <bfd.h>

bfd *abfd;
asection *p;
char *filename = "/path/to/my/file";

if ((abfd = bfd_openr(filename, NULL)) == NULL) {
    /* ... error handling */
}

if (!bfd_check_format (abfd, bfd_object)) {
    /* ... error handling */
}

for (p = abfd->sections; p != NULL; p = p->next) {
    bfd_vma  base_addr = bfd_section_vma(abfd, p);
    bfd_size_type size = bfd_section_size (abfd, p);
    const char   *name = bfd_section_name(abfd, p);
    flagword     flags = bfd_get_section_flags(abfd, p);

    if (flags & SEC_CODE) {
        printf("%s: addr=%p size=%d\n", name, base_addr, size);
    }
}

如果您只想查看 .text 段,则可以使用 strcmp 来查看段名。

这种方法的缺点是什么?Libbfd 是在 GPL 下获得许可的,因此您的整个项目都将受到 GPL 的约束。对于商业项目,这可能是一个非首发。

如果您的二进制文件是 ELF 格式,则可以改用 libelf。我不熟悉 libelf API 的工作原理,因此无法提供示例代码。Linux libelf 也是 GPL,但我相信 BSD 项目有自己的 libelf 供您使用。

编辑:当您在最小的实时操作系统环境中使用 DSP 时,这个答案是行不通的。对不起,我试过了。

于 2008-10-15T03:47:55.510 回答
1

您能否阐明您感兴趣的工具链和架构。

在我现在使用的编译器(IAR ARM C/C++)上,编译器内置了一些运算符,它们返回段开始地址__sfb(...)、段结束地址__sfe(...)和段大小__sfs(...)

于 2008-10-15T04:12:52.167 回答
1

您要查找的符号是__text____etext__分别指向该.text部分的开头和结尾。

您可能会发现生成的.map文件很有用,因为它列出了应用程序中定义的所有符号和部分。

于 2008-10-15T21:36:32.873 回答