6

プログラム内からプログラムのメモリの .text セクションへのポインターを取得するにはどうすればよいですか? また、バックグラウンドで実行される継続的なセルフテストの一部として「フラッシュからメモリへ」の比較を行うために、セクションの長さも必要です。

ツールセットは、使用しているツールのリンカー .cmd ファイルを自動的に生成します。また、使用しているボードのボード サポート パッケージでは、独自に作成するのではなく、生成された .cmd ファイルを使用する必要があります。(後からいじるスクリプトを追加するためのmakeファイルもありません。)

編集: コード コンポーザ 3.1 環境を使用して TI TMS 6713 DSP を使用しています。私が使用しているカードは、顧客が契約し、別の組織によって作成されたものであるため、そのカードに関する情報を実際に示すことはできません. ただし、BSP は TI の「DSP BIOS」構成ツールに依存しており、範囲外の作業を掘り下げることなく、設定をあまりごまかすことはできません。

4

4 に答える 4

4

リンカースクリプトに「変数」を入れる必要があります。

私のプロジェクトの1つでは、私のセクションの1つにこれがあります:

  __FlashStart = .;

Cプログラムでは、これがあります:

extern unsigned long int _FlashStart;
unsigned long int address = (unsigned long int)&_FlashStart;
于 2008-10-14T20:00:15.860 に答える
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 セグメントだけを見たい場合は、セクション名に対して strcmp を実行します。

このアプローチの欠点は?libbfd は GPL の下でライセンスされているため、プロジェクト全体が GPL の対象になります。商用プロジェクトの場合、これはスターターではない可能性があります。

バイナリが ELF 形式の場合は、代わりに libelf を使用できます。libelf API の仕組みに詳しくないので、サンプル コードを提供できません。Linux の libelf も GPL ですが、BSD プロジェクトには独自の libelf があり、それを使用できると思います。

編集:最小のリアルタイムOS環境でDSPに取り組んでいるため、この答えはうまくいきません。すみません、試しました。

于 2008-10-15T03:47:55.510 に答える
1

探している記号は、それぞれセクションの開始__text____etext__終了を指します。.text

生成され.mapたファイルには、アプリケーションで定義されているすべてのシンボルとセクションがリストされているため、便利な場合があります。

于 2008-10-15T21:36:32.873 に答える
1

興味のあるツール チェーンとアーキテクチャを明確にしていただけますか。

私が現在使用しているコンパイラ (IAR ARM C/C++) には、セグメント開始アドレス__sfb(...)、セグメント終了アドレス__sfe(...)、およびセグメント サイズを返すコンパイラに組み込まれた演算子があります。__sfs(...)

于 2008-10-15T04:12:52.167 に答える