realocatable code
Gerhard TAEUBL
GTaeubl@frequentis.com
Mon Jan 22 02:21:00 GMT 2001
Hallo!
I have to compiled code realocate able. So I use the following
makefile:
ÃÂ
$(BUILD_DIR)/%.o: %.c ÃÂ $(CC) -g -c -Wall -W -mrelocatable -o
$@ $<
ÃÂ
$(BUILD_DIR)/%.o : %.s ÃÂ $(AS) -o $@ $<
ÃÂ
$(ELF_FILE): $(O_FILES) ../src/$(LINK_FILE) ÃÂ $(LD)
-nostartfiles -T ../src/$(LINK_FILE) -Map
$(MAP_FILE)\ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ -o $(ELF_FILE)
$(O_FILES)
ÃÂ
$(TMP_FILE): $(ELF_FILE) ÃÂ $(OBJCOPY) --strip-all --strip-debug
--remove-section .comment\ ÃÂ ÃÂ ÃÂ --output-target binary
$(ELF_FILE) $(TMP_FILE)
ÃÂ
$(BIN_FILE): $(TMP_FILE) ÃÂ $(PERL) $(MODCRC32) $(TMP_FILE)
$(BUILD_DIR)/lmodule.tmp ÃÂ $(PERL) $(SBUS_DL) $(BUILD_DIR)/lmodule.tmp
$(BIN_FILE) ÃÂ $(RM) $(BUILD_DIR)/lmodule.tmp $(TMP_FILE)
ÃÂ Well this works fine with:
as 2.8.1
gcc 2.7.2.1
ld 2.8.1
(I know this compiler is a little bit too old.. :-) )
Then I update to:
as 2.9.1
gcc 2.91.57
ld 2.9.1
ÃÂ
After that I get an error message:
/project/v4/software/ext-tools/egcs-1.1b-newlib/bin/powerpc-eabi-gcc -g
-c -Wall -W -mrelocatable -o ../build/lmodule.o lmodule.c lmodule.c: In function
`EventHandler': lmodule.c:267: warning: unused parameter
`Event' /project/v4/software/ext-tools/egcs-1.1b-newlib/bin/powerpc-eabi-as
-o ../build/iotable.o iotable.s
/project/v4/software/ext-tools/egcs-1.1b-newlib/bin/powerpc-eabi-ld
-nostartfiles -r -T ../src/lmodule.lnk -Map
../build/lmodule.map\ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ -o
../build/lmodule.elfÃÂ ../build/lmodule.oÃÂ
../build/iotable.o /project/v4/software/ext-tools/egcs-1.1b-newlib/bin/powerpc-eabi-ld:
../build/lmodule.o: compiled with -mrelocatable and linked with modules compiled
normally Bad value: failed to merge target specific data of file
../build/lmodule.o make: *** [../build/lmodule.elf] Error 1
If I use the old linker everthing is fine, so whats wrong?
ÃÂ
Here is the linker file:
ENTRY( InitModule)
ÃÂ
OUTPUT_FORMAT("elf32-powerpc",
"elf32-powerpc", ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
"elf32-powerpc") OUTPUT_ARCH(powerpc)
ÃÂ
SECTIONS { ÃÂ ÃÂ .iotable : ÃÂ ÃÂ
{ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
../build/iotable.o(.data)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
}
ÃÂ
ÃÂ ÃÂ .text : ÃÂ ÃÂ
{ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
../build/lmodule.o(.text) ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
*(.text) ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ /* .gnu.warning sections are handled
specially by elf32.em.ÃÂ */ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
*(.gnu.warning) ÃÂ ÃÂ } =0
ÃÂ
__IMAGE_START = ADDR(.text); __TSTRAM_START =
__IMAGE_START;
ÃÂ
ÃÂ ÃÂ
.initÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: { *(.init)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
=0 ÃÂ ÃÂ
.finiÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: { *(.fini)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
=0
ÃÂ
ÃÂ ÃÂ /* Read-only sections, merged into text segment:
*/ ÃÂ ÃÂ
.interpÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.interp)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.hashÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: { *(.hash)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
} ÃÂ ÃÂ
.dynsymÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.dynsym)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.dynstrÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.dynstr)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.textÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.text)ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.dataÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.data)ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.rodataÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : { *(.rela.rodata)ÃÂ ÃÂ
} ÃÂ ÃÂ
.rela.gotÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.got)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.got1ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.got1)ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.got2ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.got2)ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.ctorsÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.ctors)ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.dtorsÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.dtors)ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.initÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.init)ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.finiÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.fini)ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.bssÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.bss)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.pltÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.plt)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.sdataÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.sdata2)ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.sbssÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.sbss2)ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rela.sdata2ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : { *(.rela.sdata2)ÃÂ ÃÂ
} ÃÂ ÃÂ .rela.sbss2ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rela.sbss2)ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.pltÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: { *(.plt)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
}
ÃÂ
ÃÂ ÃÂ
.rodataÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rodata)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.rodata1ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.rodata1)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ
ÃÂ ÃÂ
.sdata2ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.sdata2)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.sbss2ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ :
{ *(.sbss2)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ
__DATA_RAM = .; __DATA_ROM = __DATA_RAM;
ÃÂ
ÃÂ ÃÂ
.dataÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: ÃÂ ÃÂ { ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
*(.data) ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ CONSTRUCTORS ÃÂ ÃÂ
} ÃÂ ÃÂ
.data1ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ :
{ *(.data1)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.got1ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: { *(.got1)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
} ÃÂ ÃÂ
.dynamicÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.dynamic)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ /* Put .ctors
and .dtors next to the .got2 section, so that the
pointers ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ get relocated with -mrelocatable.
Also put in the .fixup pointers. ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ The current
compiler no longer needs this, but keep it around for 2.7.2ÃÂ
*/ ÃÂ ÃÂ PROVIDE (_GOT2_START_ = .); ÃÂ ÃÂ
.got2ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
:ÃÂ { *(.got2)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
} ÃÂ ÃÂ PROVIDE (__CTOR_LIST__ = .); ÃÂ ÃÂ
.ctorsÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ :
{ *(.ctors)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
PROVIDE (__CTOR_END__ = .); ÃÂ ÃÂ PROVIDE (__DTOR_LIST__ =
.); ÃÂ ÃÂ
.dtorsÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ :
{ *(.dtors)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
PROVIDE (__DTOR_END__ = .); ÃÂ ÃÂ PROVIDE (_FIXUP_START_ =
.); ÃÂ ÃÂ
.fixupÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ :
{ *(.fixup)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
PROVIDE (_FIXUP_END_ = .); ÃÂ ÃÂ PROVIDE (_GOT2_END_ =
.); ÃÂ ÃÂ PROVIDE (_GOT_START_ = .); ÃÂ ÃÂ
.gotÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: { *(.got)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
} ÃÂ ÃÂ
.got.pltÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ : {
*(.got.plt)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ PROVIDE
(_GOT_END_ = .); ÃÂ ÃÂ /* We want the small data sections together, so
single-instruction offsets ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ can access them
all, and initialized data all before uninitialized,
so ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ we can shorten the on-disk segment
size.ÃÂ */ ÃÂ ÃÂ
.sdataÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ :
{ *(.sdata)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ
__DATA_ENDÃÂ ÃÂ ÃÂ ÃÂ ÃÂ =
.; __IMAGE_SIZEÃÂ ÃÂ ÃÂ = __DATA_END -
__IMAGE_START; __BSS_STARTÃÂ ÃÂ ÃÂ ÃÂ = .;
ÃÂ
ÃÂ ÃÂ
.sbssÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: ÃÂ ÃÂ { ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
*(.sbss) ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ *(.scommon) ÃÂ ÃÂ
} ÃÂ ÃÂ
.bssÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
: ÃÂ ÃÂ { ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
*(.dynbss) ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
*(.bss) ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ *(COMMON) ÃÂ ÃÂ }
ÃÂ
__BSS_ENDÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ = .;
ÃÂ
ÃÂ ÃÂ /* These are needed for ELF backends which have not yet
been ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ converted to the new style linker.ÃÂ
*/ ÃÂ ÃÂ
.stabÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ 0ÃÂ : {
*(.stab)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ } ÃÂ ÃÂ
.stabstrÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ 0ÃÂ : {
*(.stabstr)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ }
ÃÂ
ÃÂ ÃÂ /* DWARF debug sections. ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
Symbols in the .debug DWARF section are relative to the beginning of
the ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ section so we begin .debug at 0.ÃÂ
It's not clear yet what needs to happen ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ for
the others.ÃÂ ÃÂ */ ÃÂ ÃÂ
.debugÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ 0 : {
*(.debug)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
} ÃÂ ÃÂ .debug_srcinfoÃÂ 0 : { *(.debug_srcinfo)ÃÂ
} ÃÂ ÃÂ .debug_arangesÃÂ 0 : { *(.debug_aranges)ÃÂ
} ÃÂ ÃÂ .debug_pubnames 0 : { *(.debug_pubnames) } ÃÂ ÃÂ
.debug_sfnamesÃÂ 0 : { *(.debug_sfnames)ÃÂ } ÃÂ ÃÂ
.lineÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ 0 : {
*(.line)ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ
} }
ÃÂ
Could anyone help me?
Thanks
Gerhard
More information about the Gcc-help
mailing list