リンカー スクリプトを変更できれば、間違いなく簡単になります。できないので、プログラム バイナリからセクション名、アドレス、およびサイズを抽出することは可能です。たとえば、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 があり、それを使用できると思います。
編集:最小のリアルタイムOS環境でDSPに取り組んでいるため、この答えはうまくいきません。すみません、試しました。