diff --git a/compiler/ogelf.pas b/compiler/ogelf.pas index 6af27003de..9715a90ed5 100644 --- a/compiler/ogelf.pas +++ b/compiler/ogelf.pas @@ -110,6 +110,10 @@ implementation R_386_PC32 = 2; { PC-relative relocation } R_386_GOT32 = 3; { an offset into GOT } R_386_PLT32 = 4; { a PC-relative offset into PLT } + R_386_COPY = 5; + R_386_GLOB_DAT = 6; + R_386_JUMP_SLOT = 7; + R_386_RELATIVE = 8; R_386_GOTOFF = 9; { an offset from GOT base } R_386_GOTPC = 10; { a PC-relative offset _to_ GOT } R_386_GNU_VTINHERIT = 250; @@ -238,6 +242,9 @@ implementation STT_FUNC = 2; STT_SECTION = 3; STT_FILE = 4; + STT_COMMON = 5; + STT_TLS = 6; + STT_GNU_IFUNC = 10; { program header types } PT_NULL = 0; @@ -247,14 +254,20 @@ implementation PT_NOTE = 4; PT_SHLIB = 5; PT_PHDR = 6; + PT_LOOS = $60000000; + PT_HIOS = $6FFFFFFF; PT_LOPROC = $70000000; PT_HIPROC = $7FFFFFFF; + PT_GNU_EH_FRAME = PT_LOOS + $474e550; { Frame unwind information } + PT_GNU_STACK = PT_LOOS + $474e551; { Stack flags } + PT_GNU_RELRO = PT_LOOS + $474e552; { Read-only after relocation } { program header flags } PF_X = 1; PF_W = 2; PF_R = 4; - PF_MASKPROC = $F0000000; + PF_MASKOS = $0FF00000; { OS-specific reserved bits } + PF_MASKPROC = $F0000000; { Processor-specific reserved bits } { .dynamic tags } DT_NULL = 0; @@ -297,6 +310,14 @@ implementation DT_LOPROC = $70000000; DT_HIPROC = $7fffffff; + DT_RELACOUNT = $6ffffff9; + DT_RELCOUNT = $6ffffffa; + DT_FLAGS_1 = $6ffffffb; + DT_VERDEF = $6ffffffc; + DT_VERDEFNUM = $6ffffffd; + DT_VERNEED = $6ffffffe; + DT_VERNEEDNUM = $6fffffff; + type { Structures which are written directly to the output file } TElf32header=packed record @@ -424,6 +445,36 @@ implementation 1: (d_ptr: qword); end; + TElfVerdef=record { same for 32 and 64 bits } + vd_version: word; { =1 } + vd_flags: word; + vd_ndx: word; + vd_cnt: word; { number of verdaux records } + vd_hash: longword; { ELF hash of version name } + vd_aux: longword; { offset to verdaux records } + vd_next: longword; { offset to next verdef record } + end; + + TElfVerdaux=record + vda_name: longword; + vda_next: longword; + end; + + TElfVerneed=record + vn_version: word; { =VER_NEED_CURRENT } + vn_cnt: word; + vn_file: longword; + vn_aux: longword; + vn_next: longword; + end; + + TElfVernaux=record + vna_hash: longword; + vna_flags: word; + vna_other: word; + vna_name: longword; + vna_next: longword; + end; {$ifdef cpu64bitaddr} const @@ -435,6 +486,12 @@ implementation telfsechdr = telf64sechdr; telfproghdr = telf64proghdr; telfdyn = telf64dyn; + + function ELF_R_INFO(sym:longword;typ:byte):qword;inline; + begin + result:=(qword(sym) shl 32) or typ; + end; + {$else cpu64bitaddr} const ELFCLASS = ELFCLASS32; @@ -445,6 +502,11 @@ implementation telfsechdr = telf32sechdr; telfproghdr = telf32proghdr; telfdyn = telf32dyn; + + function ELF_R_INFO(sym:longword;typ:byte):longword;inline; + begin + result:=(sym shl 8) or typ; + end; {$endif cpu64bitaddr} {$ifdef x86_64} @@ -1158,11 +1220,7 @@ implementation else relsym:=SHN_UNDEF; end; -{$ifdef cpu64bitaddr} - rel.info:=(qword(relsym) shl 32) or reltyp; -{$else cpu64bitaddr} - rel.info:=(relsym shl 8) or reltyp; -{$endif cpu64bitaddr} + rel.info:=ELF_R_INFO(relsym,reltyp); { write reloc } { ElfXX_Rel is essentially ElfXX_Rela without the addend field. } MaybeSwapElfReloc(rel);