PPC: fix COFF bootloader entry point
The concept of entry point in COFF is actually different than in ELF. In COFF, the entry point is actually a "descriptor" (pointer) to the actual start code. So we patch the entry point address when calling objcopy. Now my old Performa 5400/180 actually starts the loader correctly \o/
This commit is contained in:
@@ -93,8 +93,14 @@ rule BuildCoffLoader {
|
|||||||
|
|
||||||
actions BuildCoffLoader bind HACK_COFF {
|
actions BuildCoffLoader bind HACK_COFF {
|
||||||
rm -f $(1)
|
rm -f $(1)
|
||||||
$(TARGET_OBJCOPY_$(TARGET_PACKAGING_ARCH)) -O $(COFF_FORMAT) $(2) $(1)
|
# get the address of the COFF entry
|
||||||
|
$(TARGET_OBJCOPY_$(TARGET_PACKAGING_ARCH)) -O symbolsrec $(2) $(2).syms
|
||||||
|
EP=`grep _coff_start $(2).syms | tr -d '\r' | cut -d'$' -f2`
|
||||||
|
rm -f $(2).syms
|
||||||
|
# copy to XCOFF format and patch the entry point
|
||||||
|
$(TARGET_OBJCOPY_$(TARGET_PACKAGING_ARCH)) -O $(COFF_FORMAT) --set-start="0x${EP}" $(2) $(1)
|
||||||
#$(CP) $(2) $(1)
|
#$(CP) $(2) $(1)
|
||||||
|
# fill-in some fields objcopy missed
|
||||||
$(HACK_COFF) $(1)
|
$(HACK_COFF) $(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ extern "C" void _start(uint32 _unused1, uint32 _unused2,
|
|||||||
void *openFirmwareEntry);
|
void *openFirmwareEntry);
|
||||||
extern "C" void start(void *openFirmwareEntry);
|
extern "C" void start(void *openFirmwareEntry);
|
||||||
|
|
||||||
|
// XCOFF "entry-point" is actually a pointer to the real code
|
||||||
|
extern "C" void *_coff_start;
|
||||||
|
void *_coff_start = (void *)&_start;
|
||||||
|
|
||||||
// GCC defined globals
|
// GCC defined globals
|
||||||
extern void (*__ctor_list)(void);
|
extern void (*__ctor_list)(void);
|
||||||
extern void (*__ctor_end)(void);
|
extern void (*__ctor_end)(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user