リンカー スクリプトでのロケーション カウンターの動作は理解していると思っていましたが、そうではないと思います。理解していることを確認するために簡単なテストを行いました。ライブラリー呼び出しなしで単純な C プログラムを作成し、gcc でコンパイルしました。次に、最初に位置カウンターを値に設定したリンカー スクリプトを使用してリンクしました。プログラムはこちら
int a = 6;
int main(){
return 0;
}
以下はリンカースクリプトです
ENTRY(main)
addr = 0x8048000;
SECTIONS
{
.text addr :
ALIGN(0x1000)
{
*(text*);
*(.rodata*);
}
.data :
ALIGN(0x1000)
{
*(.data*);
}
}
私はそれを実行したくありませんでしたが、objdump の出力を確認しただけです。objdump -s
エルフで行うと、開始アドレスが0x8048000として表示されるはずだと考えていました。ただし、開始アドレスは常に 0000 と表示されます
Contents of section .text:
0000 b8000000 00c3 ......
Contents of section .data:
1000 06000000 ....
Contents of section .comment:
0000 4743433a 20285562 756e7475 20342e34 GCC: (Ubuntu 4.4
0010 2e332d34 7562756e 74753529 20342e34 .3-4ubuntu5) 4.4
0020 2e3300
その上、同じく 0000 から始まるコメント セクションがあります。何が起こっているのかわかりません。
これは、リンカー スクリプトを使用しない場合の objdump の出力です (まだライブラリはありません)。
Contents of section .text:
8048094 b8000000 00c3 ......
Contents of section .data:
804909c 06000000 ....
Contents of section .comment:
0000 4743433a 20285562 756e7475 20342e34 GCC: (Ubuntu 4.4
0010 2e332d34 7562756e 74753529 20342e34 .3-4ubuntu5) 4.4
0020 2e3300