如果您可以修改链接描述文件,那肯定会更容易。由于您不能,因此可以从程序二进制文件中提取部分名称、地址和大小。例如,以下是使用 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 时,这个答案是行不通的。对不起,我试过了。