まず、次のように呼び出して、gcc の既定のリンカー スクリプトで .text セクションがどのように定義されているかを確認します (独自に作成する必要はありません)。
gcc -Wl,-verbose
これにより、デフォルトのリンカー スクリプトが出力されます。私は .text セクションについてこれを示しています:
/* text: Program code section */
.text :
{
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
}
したがって、「メイン」関数を .text セクションの最初にする (残りを連続させる) には、他のすべての関数に「セクション」属性を設定する必要があります。例えば:
void main(void);
void funct1(....) __attribute__ ((section (".text.A")));
void funct2(....) __attribute__ ((section (".text.A")));
void funct3(....) __attribute__ ((section (".text.A")));
関数プロトタイプに「属性を付ける」だけで十分です。そうすれば、今コンパイルすると、「メイン」関数が「.text」セクションの最初の関数になり、他のすべての関数はすぐに連続するアドレスに続きます。
「.text」セクション (つまり「main」関数) を特定のアドレス (0x1000 など) に配置する場合は、次のようにリンクすることを忘れないでください。
gcc .... -Wl,-Ttext=0x1000