貴重な情報をありがとうございました。このメールを頂き、私も初めてこの問題に気付いたのですが、どうもこれは Red Hat が提供している
GCC が原因のようです(私はいつも Debian 版の GCC を利用しています)。以下、竹下様がお使いの gcc バナー。
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98)
このバージョンで Hello, world! プログラムをビルドすると次のようなリンクマップが生成されます(一部省略)。
Memory Configuration
Name Origin Length Attributes
body 0x00000000 0x000001fe
sign 0x000001fe 0x00000002
*default* 0x00000000 0xffffffff
Linker script and memory map.text 0x00000000 0x15c
*(.text)
.text 0x00000000 0x20 crt.o
0x00000000 _start
.text 0x00000020 0x120 bios_tty.o
0x000000d8 print_hex16
0x00000020 printc
0x000000a4 print_hex8
0x00000038 prints
0x00000074 print_hex
0x0000010c print_hex32
.text 0x00000140 0x1c hello.o
0x00000140 main
.rodata 0x0000015c 0x17
*(.rodata*)
.rodata.str1.1
0x0000015c 0x17 hello.o
.data 0x00000174 0x0
*(.data)
.bss 0x00000174 0x0
*(.bss)
.sign 0x000001fe 0x2
sign.o(.sign)
.sign 0x000001fe 0x2 sign.o
0x000001fe sign
.rodata.str1.1 という名前のセクションが新たに作成されている点に注意してください。Red Hat GCC
は、内部で名前拡張した .rodata セクションを利用するようです。このため、リンカースリプトにおける「入力 .rodata」セクションの指定は
*(.rodata) ではなく、*(.rodata*) を指定する必要があります(.rodata
の後ろにワイルドカードを指定)。Red Hat GCC を使用する場合のリンカースクリプト修正点については、サポートページで追加訂正していますのでご覧ください。
具体的な対処法まで含めご連絡頂いた竹下様に感謝致します。