diff --git a/compiler/ogelf.pas b/compiler/ogelf.pas index 776edb5200..79720b5845 100644 --- a/compiler/ogelf.pas +++ b/compiler/ogelf.pas @@ -178,6 +178,45 @@ implementation R_X86_64_GNU_VTENTRY = 25; {$endif x86_64} + { ELFHeader.file_class } + ELFCLASSNONE = 0; + ELFCLASS32 = 1; + ELFCLASS64 = 2; + + { ELFHeader.e_type } + ET_NONE = 0; + ET_REL = 1; + ET_EXEC = 2; + ET_DYN = 3; + ET_CORE = 4; + + { ELFHeader.e_machine } + EM_SPARC = 2; + EM_386 = 3; + EM_M68K = 4; + EM_PPC = 20; + EM_ARM = 40; + EM_X86_64 = 62; + +{$ifdef sparc} + ELFMACHINE = EM_SPARC; +{$endif sparc} +{$ifdef i386} + ELFMACHINE = EM_386; +{$endif i386} +{$ifdef m68k} + ELFMACHINE = EM_M68K; +{$endif m68k} +{$ifdef powerpc} + ELFMACHINE = EM_PPC; +{$endif powerpc} +{$ifdef arm} + ELFMACHINE = EM_ARM; +{$endif arm} +{$ifdef x86_64} + ELFMACHINE = EM_X86_64; +{$endif x86_64} + SHN_UNDEF = 0; SHN_ABS = $fff1; SHN_COMMON = $fff2; @@ -212,7 +251,7 @@ implementation type { Structures which are written directly to the output file } TElf32header=packed record - magic0123 : longint; + magic : array[0..3] of byte; file_class : byte; data_encoding : byte; file_version : byte; @@ -274,7 +313,7 @@ implementation telf64header=packed record - magic0123 : longint; + magic : array[0..3] of byte; file_class : byte; data_encoding : byte; file_version : byte; @@ -307,12 +346,12 @@ implementation end; telf64proghdr=packed record p_type : longword; - p_offset : longword; + p_flags : longword; + p_offset : qword; p_vaddr : qword; p_paddr : qword; p_filesz : qword; p_memsz : qword; - p_flags : qword; p_align : qword; end; telf64reloc=packed record @@ -337,6 +376,9 @@ implementation {$ifdef cpu64bitaddr} + const + ELFCLASS = ELFCLASS64; + type telfheader = telf64header; telfreloc = telf64reloc; telfsymbol = telf64symbol; @@ -344,6 +386,9 @@ implementation telfproghdr = telf64proghdr; telfdyn = telf64dyn; {$else cpu64bitaddr} + const + ELFCLASS = ELFCLASS32; + type telfheader = telf32header; telfreloc = telf32reloc; telfsymbol = telf32symbol; @@ -1029,7 +1074,7 @@ implementation procedure TElfObjectOutput.section_write_symbol(p:TObject;arg:pointer); begin TObjSection(p).secsymidx:=symidx; - write_internal_symbol(TElfObjSection(p).shstridx,STT_SECTION,TElfObjSection(p).secshidx); + write_internal_symbol(0,STT_SECTION,TElfObjSection(p).secshidx); end; @@ -1254,39 +1299,23 @@ implementation { Write ELF Header } fillchar(header,sizeof(header),0); - header.magic0123:=$464c457f; { = #127'ELF' } -{$ifdef cpu64bitaddr} - header.file_class:=2; -{$else cpu64bitaddr} - header.file_class:=1; -{$endif cpu64bitaddr} + header.magic[0]:=$7f; { = #127'ELF' } + header.magic[1]:=$45; + header.magic[2]:=$4c; + header.magic[3]:=$46; + header.file_class:=ELFCLASS; if target_info.endian=endian_big then header.data_encoding:=2 else - header.data_encoding:=1; + header.data_encoding:=1; header.file_version:=1; - header.e_type:=1; -{$ifdef sparc} - header.e_machine:=2; -{$endif sparc} -{$ifdef i386} - header.e_machine:=3; -{$endif i386} -{$ifdef m68k} - header.e_machine:=4; -{$endif m68k} -{$ifdef powerpc} - header.e_machine:=20; -{$endif powerpc} + header.e_type:=ET_REL; + header.e_machine:=ELFMACHINE; {$ifdef arm} - header.e_machine:=40; if (current_settings.fputype=cpu_soft) then header.e_flags:=$600; {$endif arm} -{$ifdef x86_64} - header.e_machine:=62; -{$endif x86_64} header.e_version:=1; header.e_shoff:=shoffset; header.e_shstrndx:=shstrtabsect.secshidx;