如何从该程序中获取指向程序内存的.text部分的指针?我还需要该部分的长度来进行“Flash to Memory”比较,作为在后台运行的连续自测试的一部分。
工具集自动为我正在使用的工具生成链接器.cmd文件,而我正在使用的板的Board Support Package要求我使用生成的.cmd文件而不是自己生成。 (没有make文件要么用后面的文字添加脚本。)
编辑: 我正在使用代码编辑器3.1环境的TI TMS 6713 DSP。我正在使用的卡是由我们的客户签约并由另一个组织生产的,因此我无法真正指出您的任何信息。然而,BSP依赖于TI的“DSP BIOS”配置工具,如果不进行超出范围的工作,我无法真正捏造设置太多。
答案 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
文件很有用,因为它列出了应用程序中定义的所有符号和部分。