它肯定會更容易,如果你可以修改鏈接器腳本。由於您不能,因此可以從程序二進制文件中提取節名稱,地址和大小。例如,下面是如何使用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時,此答案不起作用。對不起,我試過了。