1

オブジェクト ファイルをリンクすると、生成される ELF 実行可能ファイルには次の LOAD セグメント (のみ) が含まれます。

LOAD off    0x00000000 vaddr 0x00008000 paddr 0x00008000 align 2**15
     filesz 0x000010f0 memsz 0x000010f0 flags rwx

リンカーは、書き込み可能な部分と実行可能な部分を分離するのではなく、ldすべてのセクションを 1 つのセグメントに結合しました。rwxこれを防ぎたい。リロケータブル オブジェクトには、書き込み可能または実行可能として適切にマークされたセクションがあるため、この問題はリンク時に発生します。

ldでは、がセグメントにアクセス許可を割り当てる方法を決定するものは何ですか? リンカー スクリプトには、それに関連するものはないようです。ツールチェーンのビルド時に指定されたものですか?

ARM をターゲットにしており、ツールチェーンはarm-linux-gnueabiバージョンbinutils2.22 です。

編集:リンカースクリプトはこちらです。その他のリンカー オプションは、、、-Bdynamicおよびです。--gc-sections-z nocopyreloc--no-undefined

4

1 に答える 1

1

通常、リンカー スクリプトは、セクション、その順序、それらを保持するか、バイナリから破棄するかを定義するために使用されます (リリース ビルド リンカー スクリプトは、デバッグ情報を削除することを選択する場合があります)。

リンカ スクリプトの例を次に示します: system-onesegment.ld

EDIT : セクションのパーミッションを変更するには、.section .section_name, "permission" のパーミッションを変更したいセクションの前にこれを置きます。

例:

.text
mov r0, r0
b main
.section .rodata, "ro"
.word 0x00000001
.previous
main: mov r0, r0
于 2012-06-04T16:50:05.627 に答える