R_TYPE
#define IFUNC_RELOCATION R_TYPE(JMP_IREL)
#define IFUNC_RELOCATION R_TYPE(IRELATIVE)
#define IFUNC_RELOCATION R_TYPE(IRELATIVE)
case R_TYPE(RELATIVE): /* word64 B + A */
case R_TYPE(ABS64): /* word S + A */
case R_TYPE(GLOB_DAT): /* word S + A */
case R_TYPE(NONE):
case R_TYPE(ABS64): /* word S + A */
case R_TYPE(GLOB_DAT): /* word S + A */
case R_TYPE(IRELATIVE):
case R_TYPE(RELATIVE): /* word B + A */
case R_TYPE(COPY):
case R_TYPE(TLSDESC):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT) ||
ELF_R_TYPE(rela->r_info) == R_TYPE(TLSDESC) ||
ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE));
case R_TYPE(JUMP_SLOT):
case R_TYPE(TLSDESC):
case R_TYPE(IRELATIVE):
if (ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE)) {
case R_TYPE(JUMP_SLOT):
case R_TYPE(TLSDESC):
case R_TYPE(REFQUAD):
case R_TYPE(GLOB_DAT):
case R_TYPE(TPREL64):
case R_TYPE(DTPMOD64):
case R_TYPE(DTPREL64):
case R_TYPE(NONE):
case R_TYPE(REFQUAD):
case R_TYPE(GLOB_DAT):
case R_TYPE(RELATIVE):
case R_TYPE(COPY):
case R_TYPE(TPREL64):
case R_TYPE(DTPMOD64):
case R_TYPE(DTPREL64):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
case R_TYPE(GLOB_DAT): /* word32 B + S */
case R_TYPE(TLS_DTPOFF32):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_TPOFF32):
case R_TYPE(NONE):
case R_TYPE(PC24): { /* word32 S - P + A */
case R_TYPE(ABS32): /* word32 B + S + A */
case R_TYPE(GLOB_DAT): /* word32 B + S */
case R_TYPE(IRELATIVE):
case R_TYPE(RELATIVE): /* word32 B + A */
case R_TYPE(COPY):
case R_TYPE(TLS_DTPOFF32):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_TPOFF32):
assert(ELF_R_TYPE(rel->r_info) == R_TYPE(JUMP_SLOT) ||
ELF_R_TYPE(rel->r_info) == R_TYPE(IRELATIVE));
if (ELF_R_TYPE(rel->r_info) == R_TYPE(IRELATIVE))
assert(ELF_R_TYPE(info) == R_TYPE(JUMP_SLOT));
case R_TYPE(PC24): /* word32 S - P + A */
case R_TYPE(ABS32): /* word32 B + S + A */
case R_TYPE(DIR32):
case R_TYPE(PLABEL32):
case R_TYPE(DIR32):
case R_TYPE(PLABEL32):
case R_TYPE(DIR32):
case R_TYPE(PLABEL32):
case R_TYPE(DIR32):
case R_TYPE(PLABEL32):
case R_TYPE(COPY):
case R_TYPE(TLS_TPREL32):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPOFF32):
if (ELF_R_TYPE(rela->r_info) == R_TYPE(DIR32)) {
case R_TYPE(NONE):
case R_TYPE(DIR32):
case R_TYPE(PLABEL32):
case R_TYPE(COPY):
case R_TYPE(TLS_TPREL32):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPOFF32):
if (ELF_R_TYPE(rela->r_info) == R_TYPE(NONE))
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(IPLT));
assert(ELF_R_TYPE(info) == R_TYPE(IPLT));
case R_TYPE(PC32):
case R_TYPE(GOT32):
case R_TYPE(32):
case R_TYPE(GLOB_DAT):
case R_TYPE(TLS_TPOFF):
case R_TYPE(TLS_TPOFF32):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPOFF32):
case R_TYPE(NONE):
case R_TYPE(PC32):
case R_TYPE(GOT32):
case R_TYPE(32):
case R_TYPE(GLOB_DAT):
case R_TYPE(IRELATIVE):
case R_TYPE(RELATIVE):
case R_TYPE(COPY):
case R_TYPE(TLS_TPOFF):
case R_TYPE(TLS_TPOFF32):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPOFF32):
assert(ELF_R_TYPE(rel->r_info) == R_TYPE(JMP_SLOT) ||
ELF_R_TYPE(rel->r_info) == R_TYPE(IRELATIVE));
if (ELF_R_TYPE(rel->r_info) == R_TYPE(IRELATIVE))
if (ELF_R_TYPE(info) == R_TYPE(IRELATIVE))
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
case R_TYPE(PC32):
case R_TYPE(GOT32):
case R_TYPE(32):
case R_TYPE(GLOB_DAT):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPREL32):
case R_TYPE(TLS_TPREL32):
case R_TYPE(NONE):
case R_TYPE(PC32):
case R_TYPE(GOT32):
case R_TYPE(32):
case R_TYPE(GLOB_DAT):
case R_TYPE(RELATIVE):
case R_TYPE(COPY):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPREL32):
case R_TYPE(TLS_TPREL32):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
case R_TYPE(REL32): {
assert(r_type == R_TYPE(REL32)
|| r_type == (R_TYPE(REL32)|(R_TYPE(64) << 8)));
case R_TYPE(GPREL32):
case R_TYPE(NONE):
case R_TYPE(TLS_DTPMOD64):
case R_TYPE(TLS_DTPREL64):
case R_TYPE(TLS_TPREL64):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPREL32):
case R_TYPE(TLS_TPREL32):
case R_TYPE(NONE):
case R_TYPE(REL32): {
case R_TYPE(TLS_DTPMOD64):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPREL64):
case R_TYPE(TLS_DTPREL32):
case R_TYPE(TLS_TPREL64):
case R_TYPE(TLS_TPREL32):
#define ELF_R_NXTTYPE_64_P(r_type) ((((r_type) >> 8) & 0xff) == R_TYPE(64))
case R_TYPE(32): /* <address> S + A */
case R_TYPE(GLOB_DAT): /* <address> S + A */
case R_TYPE(TLS_DTPMOD):
case R_TYPE(TLS_DTPOFF):
case R_TYPE(TLS_TPOFF):
case R_TYPE(JMP_SLOT):
case R_TYPE(NONE):
case R_TYPE(32): /* <address> S + A */
case R_TYPE(GLOB_DAT): /* <address> S + A */
case R_TYPE(RELATIVE): /* <address> B + A */
case R_TYPE(COPY):
case R_TYPE(TLS_DTPMOD):
case R_TYPE(TLS_DTPOFF):
case R_TYPE(TLS_TPOFF):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
case R_TYPE(ADDR64): /* <address> S + A */
case R_TYPE(ADDR32): /* <address> S + A */
case R_TYPE(UADDR32): /* <address> S + A */
case R_TYPE(GLOB_DAT): /* <address> S + A */
case R_TYPE(ADDR16_LO):
case R_TYPE(ADDR16_HI):
case R_TYPE(ADDR16_HA):
case R_TYPE(DTPMOD):
case R_TYPE(DTPREL):
case R_TYPE(TPREL):
case R_TYPE(JMP_SLOT):
case R_TYPE(NONE):
case R_TYPE(ADDR64): /* <address> S + A */
case R_TYPE(ADDR32): /* <address> S + A */
case R_TYPE(UADDR32): /* <address> S + A */
case R_TYPE(GLOB_DAT): /* <address> S + A */
case R_TYPE(ADDR16_LO): {
case R_TYPE(ADDR16_HI):
case R_TYPE(ADDR16_HA): {
if (ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HA)
(ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HI)
(ELF_R_TYPE(rela->r_info) == R_TYPE(ADDR16_HI)
case R_TYPE(RELATIVE): /* <address> B + A */
case R_TYPE(COPY):
case R_TYPE(DTPMOD):
case R_TYPE(DTPREL):
case R_TYPE(TPREL):
case R_TYPE(IRELATIVE):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT) ||
ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE));
if (ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE)) {
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
case R_TYPE(NONE):
case R_TYPE(NONE):
case R_TYPE(RELATIVE): {
case R_TYPE(COPY):
case R_TYPE(JMP_SLOT):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
case R_TYPE(RELATIVE): {
case R_TYPE(GOT32):
case R_TYPE(REL32):
case R_TYPE(DIR32):
case R_TYPE(GLOB_DAT):
case R_TYPE(TLS_DTPOFF32):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_TPOFF32):
case R_TYPE(NONE):
case R_TYPE(GOT32):
case R_TYPE(REL32):
case R_TYPE(DIR32):
case R_TYPE(GLOB_DAT):
case R_TYPE(RELATIVE):
case R_TYPE(COPY):
case R_TYPE(TLS_DTPOFF32):
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_TPOFF32):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
#define RELOC_TLS(t) (t >= R_TYPE(TLS_GD_HI22))
if (type == R_TYPE(NONE))
if (type == R_TYPE(JMP_SLOT))
if (type == R_TYPE(IRELATIVE)) {
if (type == R_TYPE(COPY))
if (type > R_TYPE(TLS_TPOFF64))
case R_TYPE(TLS_DTPMOD32):
case R_TYPE(TLS_DTPOFF32):
case R_TYPE(TLS_TPOFF32):
if (type > R_TYPE(6))
if (type == R_TYPE(RELATIVE)) {
if (ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_IREL))
if (ELF_R_TYPE(info) == R_TYPE(JMP_IREL))
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
static const int reloc_target_flags[R_TYPE(TLS_TPOFF64)+1] = {
#define RELOC_TLS(t) (t >= R_TYPE(TLS_GD_HI22))
if (type == R_TYPE(NONE))
if (type == R_TYPE(JMP_SLOT))
if (type == R_TYPE(IRELATIVE)) {
if (type == R_TYPE(COPY))
if (type > R_TYPE(TLS_TPOFF64)) {
case R_TYPE(TLS_DTPMOD64):
case R_TYPE(TLS_DTPOFF64):
case R_TYPE(TLS_TPOFF64):
if (type == R_TYPE(RELATIVE)) {
if (ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_IREL))
if (ELF_R_TYPE(obj->pltrela->r_info) == R_TYPE(JMP_SLOT) ||
ELF_R_TYPE(obj->pltrela->r_info) == R_TYPE(JMP_IREL)) {
if (ELF_R_TYPE(obj->pltrela->r_info) != R_TYPE(JMP_SLOT) &&
ELF_R_TYPE(obj->pltrela->r_info) != R_TYPE(JMP_IREL))
if (ELF_R_TYPE(info) == R_TYPE(JMP_IREL))
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
static const int reloc_target_flags[R_TYPE(TLS_TPOFF64)+1] = {
case R_TYPE(NONE):
case R_TYPE(32): /* word32 S + A */
case R_TYPE(GLOB_DAT): /* word32 S + A */
case R_TYPE(RELATIVE): /* word32 B + A */
case R_TYPE(COPY):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JMP_SLOT));
assert(ELF_R_TYPE(info) == R_TYPE(JMP_SLOT));
case R_TYPE(32): /* word32 S + A */
case R_TYPE(GLOB_DAT): /* word32 S + A */
case R_TYPE(32): /* word32 S + A, truncate */
case R_TYPE(32S): /* word32 S + A, signed truncate */
case R_TYPE(GOT32): /* word32 G + A (XXX can we see these?) */
case R_TYPE(64): /* word64 S + A */
case R_TYPE(PC32): /* word32 S + A - P */
case R_TYPE(GLOB_DAT): /* word64 S */
case R_TYPE(TPOFF64):
case R_TYPE(DTPMOD64):
case R_TYPE(DTPOFF64):
case R_TYPE(NONE):
case R_TYPE(32): /* word32 S + A, truncate */
case R_TYPE(32S): /* word32 S + A, signed truncate */
case R_TYPE(GOT32): /* word32 G + A (XXX can we see these?) */
case R_TYPE(64): /* word64 S + A */
case R_TYPE(PC32): /* word32 S + A - P */
case R_TYPE(GLOB_DAT): /* word64 S */
case R_TYPE(RELATIVE): /* word64 B + A */
case R_TYPE(TPOFF64):
case R_TYPE(DTPMOD64):
case R_TYPE(DTPOFF64):
case R_TYPE(COPY):
case R_TYPE(IRELATIVE):
assert(ELF_R_TYPE(rela->r_info) == R_TYPE(JUMP_SLOT) ||
ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE));
if (ELF_R_TYPE(rela->r_info) == R_TYPE(IRELATIVE))
if (ELF_R_TYPE(info) == R_TYPE(IRELATIVE))
assert(ELF_R_TYPE(info) == R_TYPE(JUMP_SLOT));
if (ELF_R_TYPE(rel->r_info) == R_TYPE(COPY)) {
if (ELF_R_TYPE(rela->r_info) == R_TYPE(COPY)) {
#define PLT_IRELATIVE R_TYPE(JMP_IREL)
#define PLT_IRELATIVE R_TYPE(IRELATIVE)
if (ELF_R_TYPE(rela->r_info) != R_TYPE(IRELATIVE))
if (ELF_R_TYPE(rel->r_info) == R_TYPE(IRELATIVE)) {
if (ELF_R_TYPE(rel->r_info) == R_TYPE(IRELATIVE)) {
case R_TYPE(NONE):
case R_TYPE(RELATIVE): /* word32 B + A */
case R_TYPE(NONE):
case R_TYPE(DIR32):
case R_TYPE(DIR21L):
case R_TYPE(DIR17R):
case R_TYPE(DIR14R):
case R_TYPE(PCREL32):
case R_TYPE(PCREL17F):
case R_TYPE(DPREL21L):
case R_TYPE(DPREL14R):
case R_TYPE(PLABEL32):
case R_TYPE(SEGREL32):
case R_TYPE(DIR32):
case R_TYPE(PCREL32):
case R_TYPE(PLABEL32):
case R_TYPE(SEGREL32):
case R_TYPE(DIR14R):
case R_TYPE(DPREL14R):
case R_TYPE(DIR17R):
case R_TYPE(PCREL17F):
case R_TYPE(DIR21L):
case R_TYPE(DPREL21L):
case R_TYPE(NONE):
case R_TYPE(RELATIVE):
case R_TYPE(NONE):
case R_TYPE(PC32):
case R_TYPE(32):
case R_TYPE(GLOB_DAT):
case R_TYPE(RELATIVE):
case R_TYPE(NONE): /* none */
case R_TYPE(32): /* S + A */
case R_TYPE(26): /* (((A << 2) | (P & 0xf0000000)) + S) >> 2 */
case R_TYPE(HI16): /* %high(AHL + S) = (x - (short)x) >> 16 */
case R_TYPE(LO16): /* AHL + S */
case R_TYPE(64): /* S + A */
case R_TYPE(HIGHER): /* %higher(A + S) =
case R_TYPE(HIGHEST): /* %highest(A + S) =
case R_TYPE(NONE):
case R_TYPE(DIR32):
case R_TYPE(REL32):
if (rtype == R_TYPE(REL32))
if (type == R_TYPE(NONE))
if (type == R_TYPE(JMP_SLOT) || type == R_TYPE(COPY) ||
type > R_TYPE(6)) {
if (type == R_TYPE(RELATIVE)) {
%token R_TYPE R_NAME R_SRC_ZONE R_DST_UNIT_BITS
type : R_TYPE types { set_type($2); }