mirror of
https://github.com/elliotnunn/NetBoot.git
synced 2024-09-01 00:28:57 +00:00
277 lines
7.9 KiB
C
277 lines
7.9 KiB
C
/* elf_reloc_ppc.h ELF relocation types for PowerPC */
|
|
/* (c) in 2002-2008,2016 by Frank Wille */
|
|
|
|
#define R_PPC_NONE 0
|
|
#define R_PPC_ADDR32 1
|
|
#define R_PPC_ADDR24 2
|
|
#define R_PPC_ADDR16 3
|
|
#define R_PPC_ADDR16_LO 4
|
|
#define R_PPC_ADDR16_HI 5
|
|
#define R_PPC_ADDR16_HA 6
|
|
#define R_PPC_ADDR14 7
|
|
#define R_PPC_ADDR14_BRTAKEN 8
|
|
#define R_PPC_ADDR14_BRNTAKEN 9
|
|
#define R_PPC_REL24 10
|
|
#define R_PPC_REL14 11
|
|
#define R_PPC_REL14_BRTAKEN 12
|
|
#define R_PPC_REL14_BRNTAKEN 13
|
|
#define R_PPC_GOT16 14
|
|
#define R_PPC_GOT16_LO 15
|
|
#define R_PPC_GOT16_HI 16
|
|
#define R_PPC_GOT16_HA 17
|
|
#define R_PPC_PLTREL24 18
|
|
#define R_PPC_COPY 19
|
|
#define R_PPC_GLOB_DAT 20
|
|
#define R_PPC_JMP_SLOT 21
|
|
#define R_PPC_RELATIVE 22
|
|
#define R_PPC_LOCAL24PC 23
|
|
#define R_PPC_UADDR32 24
|
|
#define R_PPC_UADDR16 25
|
|
#define R_PPC_REL32 26
|
|
#define R_PPC_PLT32 27
|
|
#define R_PPC_PLTREL32 28
|
|
#define R_PPC_PLT16_LO 29
|
|
#define R_PPC_PLT16_HI 30
|
|
#define R_PPC_PLT16_HA 31
|
|
#define R_PPC_SDAREL16 32
|
|
#define R_PPC_SECTOFF 33
|
|
#define R_PPC_SECTOFF_LO 34
|
|
#define R_PPC_SECTOFF_HI 35
|
|
#define R_PPC_SECTOFF_HA 36
|
|
#define R_PPC_ADDR30 37
|
|
#define R_PPC_EMB_NADDR32 101
|
|
#define R_PPC_EMB_NADDR16 102
|
|
#define R_PPC_EMB_NADDR16_LO 103
|
|
#define R_PPC_EMB_NADDR16_HI 104
|
|
#define R_PPC_EMB_NADDR16_HA 105
|
|
#define R_PPC_EMB_SDAI16 106
|
|
#define R_PPC_EMB_SDA2I16 107
|
|
#define R_PPC_EMB_SDA2REL 108
|
|
#define R_PPC_EMB_SDA21 109
|
|
#define R_PPC_EMB_MRKREF 110
|
|
#define R_PPC_EMB_RELSEC16 111
|
|
#define R_PPC_EMB_RELST_LO 112
|
|
#define R_PPC_EMB_RELST_HI 113
|
|
#define R_PPC_EMB_RELST_HA 114
|
|
#define R_PPC_EMB_BIT_FLD 115
|
|
#define R_PPC_EMB_RELSDA 116
|
|
#define R_PPC_MORPHOS_DREL 200
|
|
#define R_PPC_MORPHOS_DREL_LO 201
|
|
#define R_PPC_MORPHOS_DREL_HI 202
|
|
#define R_PPC_MORPHOS_DREL_HA 203
|
|
#define R_PPC_AMIGAOS_BREL 210
|
|
#define R_PPC_AMIGAOS_BREL_LO 211
|
|
#define R_PPC_AMIGAOS_BREL_HI 212
|
|
#define R_PPC_AMIGAOS_BREL_HA 213
|
|
#define R_PPC_GNU_VTINHERIT 253
|
|
#define R_PPC_GNU_VTENTRY 254
|
|
#define R_PPC_TOC16 255
|
|
|
|
|
|
if ((*rl)->type <= LAST_PPC_RELOC) {
|
|
nreloc *r = (nreloc *)(*rl)->reloc;
|
|
|
|
*refsym = r->sym;
|
|
*addend = r->addend;
|
|
pos = r->bitoffset;
|
|
size = r->size;
|
|
*roffset = r->byteoffset;
|
|
mask = r->mask;
|
|
|
|
switch ((*rl)->type) {
|
|
|
|
case REL_ABS:
|
|
if (pos==0 && mask==~0) {
|
|
if (size == 32)
|
|
t = R_PPC_ADDR32;
|
|
else if (size == 16)
|
|
t = R_PPC_ADDR16;
|
|
}
|
|
else if (size==30 && pos==0 && mask==~3)
|
|
t = R_PPC_ADDR30;
|
|
else if (size==24 && pos==6 && mask==0x3fffffc)
|
|
t = R_PPC_ADDR24;
|
|
else if (size==14 && pos==0 && mask==0xfffc)
|
|
t = R_PPC_ADDR14;
|
|
else if (size==16 && pos==0) {
|
|
if (mask == 0x0000ffff)
|
|
t = R_PPC_ADDR16_LO;
|
|
else if (mask == 0xffff0000) {
|
|
if (rl2 = (*rl)->next) {
|
|
nreloc *r2 = (nreloc *)rl2->reloc;
|
|
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
|
|
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
|
|
t = R_PPC_ADDR16_HA;
|
|
*rl = (*rl)->next;
|
|
}
|
|
}
|
|
else
|
|
t = R_PPC_ADDR16_HI;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case REL_PC:
|
|
if (size==32 && pos==0 && mask==~0)
|
|
t = R_PPC_REL32;
|
|
else if (size==24 && pos==6 && mask==0x3fffffc)
|
|
t = R_PPC_REL24;
|
|
else if (size==14 && pos==0 && mask==0xfffc)
|
|
t = R_PPC_REL14;
|
|
break;
|
|
|
|
case REL_GOT:
|
|
if (size==16 && pos==0 && mask==~0)
|
|
t = R_PPC_GOT16;
|
|
else if (size==16 && pos==0) {
|
|
if (mask == 0x0000ffff)
|
|
t = R_PPC_GOT16_LO;
|
|
else if (mask == 0xffff0000) {
|
|
if (rl2 = (*rl)->next) {
|
|
nreloc *r2 = (nreloc *)rl2->reloc;
|
|
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
|
|
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
|
|
t = R_PPC_GOT16_HA;
|
|
*rl = (*rl)->next;
|
|
}
|
|
}
|
|
else
|
|
t = R_PPC_GOT16_HI;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case REL_PLT:
|
|
if (size==32 && pos==0 && mask==~0)
|
|
t = R_PPC_PLT32;
|
|
else if (size==16 && pos==0) {
|
|
if (mask == 0x0000ffff)
|
|
t = R_PPC_PLT16_LO;
|
|
else if (mask == 0xffff0000) {
|
|
if (rl2 = (*rl)->next) {
|
|
nreloc *r2 = (nreloc *)rl2->reloc;
|
|
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
|
|
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
|
|
t = R_PPC_PLT16_HA;
|
|
*rl = (*rl)->next;
|
|
}
|
|
}
|
|
else
|
|
t = R_PPC_PLT16_HI;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case REL_PLTPC:
|
|
if (size==32 && pos==0 && mask==~0)
|
|
t = R_PPC_PLTREL32;
|
|
else if (size==24 && pos==6 && mask==0x3fffffc)
|
|
t = R_PPC_PLTREL24;
|
|
break;
|
|
|
|
case REL_SD:
|
|
if (size==16 && pos==0 && mask==~0)
|
|
t = R_PPC_SDAREL16;
|
|
break;
|
|
|
|
case REL_LOCALPC:
|
|
if (size==24 && pos==6 && mask==0x3fffffc)
|
|
t = R_PPC_LOCAL24PC;
|
|
break;
|
|
|
|
case REL_UABS:
|
|
if (pos==0 && mask==~0) {
|
|
if (size == 32)
|
|
t = R_PPC_UADDR32;
|
|
else if (size == 16)
|
|
t = R_PPC_UADDR16;
|
|
}
|
|
break;
|
|
|
|
case REL_SECOFF:
|
|
if (size==16 && pos==0 && mask==~0)
|
|
t = R_PPC_SECTOFF;
|
|
else if (size==16 && pos==0) {
|
|
if (mask == 0x0000ffff)
|
|
t = R_PPC_SECTOFF_LO;
|
|
else if (mask == 0xffff0000) {
|
|
if (rl2 = (*rl)->next) {
|
|
nreloc *r2 = (nreloc *)rl2->reloc;
|
|
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
|
|
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
|
|
t = R_PPC_SECTOFF_HA;
|
|
*rl = (*rl)->next;
|
|
}
|
|
}
|
|
else
|
|
t = R_PPC_SECTOFF_HI;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case REL_PPCEABI_SDA2:
|
|
if (size==16 && pos==0 && mask==~0)
|
|
t = R_PPC_EMB_SDA2REL;
|
|
break;
|
|
|
|
case REL_PPCEABI_SDA21:
|
|
if (size==16 && pos==0 && mask==~0) {
|
|
t = R_PPC_EMB_SDA21;
|
|
*roffset -= 2; /* sda21 starts at beginning of instr. word! */
|
|
}
|
|
break;
|
|
|
|
case REL_PPCEABI_SDAI16:
|
|
if (size==16 && pos==0 && mask==~0)
|
|
t = R_PPC_EMB_SDAI16;
|
|
break;
|
|
|
|
case REL_PPCEABI_SDA2I16:
|
|
if (size==16 && pos==0 && mask==~0)
|
|
t = R_PPC_EMB_SDA2I16;
|
|
break;
|
|
|
|
case REL_MORPHOS_DREL:
|
|
if (size==16 && pos==0 && mask==~0)
|
|
t = R_PPC_MORPHOS_DREL;
|
|
else if (size==16 && pos==0) {
|
|
if (mask == 0x0000ffff)
|
|
t = R_PPC_MORPHOS_DREL_LO;
|
|
else if (mask == 0xffff0000) {
|
|
if (rl2 = (*rl)->next) {
|
|
nreloc *r2 = (nreloc *)rl2->reloc;
|
|
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
|
|
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
|
|
t = R_PPC_MORPHOS_DREL_HA;
|
|
*rl = (*rl)->next;
|
|
}
|
|
}
|
|
else
|
|
t = R_PPC_MORPHOS_DREL_HI;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case REL_AMIGAOS_BREL:
|
|
if (size==16 && pos==0 && mask==~0)
|
|
t = R_PPC_AMIGAOS_BREL;
|
|
else if (size==16 && pos==0) {
|
|
if (mask == 0x0000ffff)
|
|
t = R_PPC_AMIGAOS_BREL_LO;
|
|
else if (mask == 0xffff0000) {
|
|
if (rl2 = (*rl)->next) {
|
|
nreloc *r2 = (nreloc *)rl2->reloc;
|
|
if (rl2->type==(*rl)->type && r2->byteoffset==*roffset &&
|
|
r2->bitoffset==pos && r2->size==size && r2->mask==0x8000) {
|
|
t = R_PPC_AMIGAOS_BREL_HA;
|
|
*rl = (*rl)->next;
|
|
}
|
|
}
|
|
else
|
|
t = R_PPC_AMIGAOS_BREL_HI;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|