你如何获得指向.text部分的指针?

时间:2008-10-14 19:52:39

标签: c embedded

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

工具集自动为我正在使用的工具生成链接器.cmd文件,而我正在使用的板的Board Support Package要求我使用生成的.cmd文件而不是自己生成。 (没有make文件要么用后面的文字添加脚本。)

编辑: 我正在使用代码编辑器3.1环境的TI TMS 6713 DSP。我正在使用的卡是由我们的客户签约并由另一个组织生产的,因此我无法真正指出您的任何信息。然而,BSP依赖于TI的“DSP BIOS”配置工具,如果不进行超出范围的工作,我无法真正捏造设置太多。

4 个答案:

答案 0 :(得分:4)

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

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

  __FlashStart = .;

在C程序中我有这个:

extern unsigned long int _FlashStart;
unsigned long int address = (unsigned long int)&_FlashStart;

答案 1 :(得分: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段,你就可以查看部分名称。

这种方法的缺点是什么? Libbfd是根据GPL许可的,因此您的整个项目将受到GPL的限制。对于商业项目,这可能是一个非首发。

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

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

答案 2 :(得分:1)

您能澄清一下您感兴趣的工具链和架构吗?

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

答案 3 :(得分:1)

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

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