1,295 → 1,382 |
(* |
Copyright 2016 Anton Krotov |
(* |
BSD 2-Clause License |
|
This file is part of Compiler. |
Copyright (c) 2019, Anton Krotov |
All rights reserved. |
*) |
|
Compiler is free software: you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation, either version 3 of the License, or |
(at your option) any later version. |
MODULE ELF; |
|
Compiler is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
IMPORT BIN, WR := WRITER, CHL := CHUNKLISTS; |
|
You should have received a copy of the GNU General Public License |
along with Compiler. If not, see <http://www.gnu.org/licenses/>. |
*) |
|
MODULE ELF; |
CONST |
|
IMPORT SYSTEM; |
EI_NIDENT = 16; |
ET_EXEC = 2; |
ET_DYN = 3; |
|
CONST size* = 8346; |
EM_386 = 3; |
EM_8664 = 3EH; |
|
PROCEDURE [stdcall] data; |
ELFCLASS32 = 1; |
ELFCLASS64 = 2; |
|
ELFDATA2LSB = 1; |
ELFDATA2MSB = 2; |
|
PF_X = 1; |
PF_W = 2; |
PF_R = 4; |
|
|
TYPE |
|
Elf32_Ehdr = RECORD |
|
e_ident: ARRAY EI_NIDENT OF BYTE; |
|
e_type, |
e_machine: WCHAR; |
|
e_version, |
e_entry, |
e_phoff, |
e_shoff, |
e_flags: INTEGER; |
|
e_ehsize, |
e_phentsize, |
e_phnum, |
e_shentsize, |
e_shnum, |
e_shstrndx: WCHAR |
|
END; |
|
|
Elf32_Phdr = RECORD |
|
p_type, |
p_offset, |
p_vaddr, |
p_paddr, |
p_filesz, |
p_memsz, |
p_flags, |
p_align: INTEGER |
|
END; |
|
FILE = WR.FILE; |
|
|
PROCEDURE align (n, _align: INTEGER): INTEGER; |
BEGIN |
SYSTEM.CODE("7F454C4601010100000000000000000002000300010000004086040834000000"); |
SYSTEM.CODE("A41120000000000034002000080028001D001A00060000003400000034800408"); |
SYSTEM.CODE("3480040800010000000100000500000004000000030000003401000034810408"); |
SYSTEM.CODE("3481040813000000130000000400000001000000010000000000000000800408"); |
SYSTEM.CODE("00800408240C1000240C10000500000000100000010000000C0F10000C9F1408"); |
SYSTEM.CODE("0C9F1408540110009401900C060000000010000002000000200F1000209F1408"); |
SYSTEM.CODE("209F1408D0000000D00000000600000004000000040000004801000048810408"); |
SYSTEM.CODE("488104084400000044000000040000000400000051E574640000000000000000"); |
SYSTEM.CODE("000000000000000000000000060000000400000052E574640C0F10000C9F1408"); |
SYSTEM.CODE("0C9F1408F4000000F400000004000000010000002F6C69622F6C642D6C696E75"); |
SYSTEM.CODE("782E736F2E320000040000001000000001000000474E55000000000002000000"); |
SYSTEM.CODE("060000000F000000040000001400000003000000474E55006D648AA1A4FF8A62"); |
SYSTEM.CODE("6855372198B3905D7B4527570300000005000000040000000700000092005000"); |
SYSTEM.CODE("126388F68400000080044030050000000800000013000000AEC44D0F281D8C1C"); |
SYSTEM.CODE("4701750FAC4BE3C086F0967C328E750F20CF09FD38F28B1C7C8B730F060204F9"); |
SYSTEM.CODE("16EA76FE3CAD390D665561103F7E967C7D1B760F000000000000000000000000"); |
SYSTEM.CODE("000000000C0000000000000000000000200000001B0000000000000000000000"); |
SYSTEM.CODE("20000000A20000000000000000000000120000006C0000000000000000000000"); |
SYSTEM.CODE("12000000360000008C85040800000000120000007900000080A0240804000000"); |
SYSTEM.CODE("110018009C0000001C8604080000000012000000460000000C8C140804000000"); |
SYSTEM.CODE("11000F00B40000007C8504080000000012000000730000009C85040800000000"); |
SYSTEM.CODE("1200000080000000AC85040800000000120000008E00000060A0240804000000"); |
SYSTEM.CODE("110018005A000000BC85040800000000120000002F000000CC85040800000000"); |
SYSTEM.CODE("1200000095000000FC8504080000000012000000870000000C86040800000000"); |
SYSTEM.CODE("120000006600000064A024080400000011001800550000002C86040800000000"); |
SYSTEM.CODE("1200000060000000DC8504080000000012000000006C6962646C2E736F2E3200"); |
SYSTEM.CODE("5F5F676D6F6E5F73746172745F5F005F4A765F5265676973746572436C617373"); |
SYSTEM.CODE("657300646C6F70656E00646C73796D006C6962632E736F2E36005F494F5F7374"); |
SYSTEM.CODE("64696E5F75736564006578697400666F70656E006674656C6C00737464696E00"); |
SYSTEM.CODE("7072696E746600667365656B007374646F75740066636C6F7365006D616C6C6F"); |
SYSTEM.CODE("630073746465727200667772697465006672656164005F5F6C6962635F737461"); |
SYSTEM.CODE("72745F6D61696E006672656500474C4942435F322E3100474C4942435F322E30"); |
SYSTEM.CODE("0000000000000000020002000300020002000100020002000400020004000500"); |
SYSTEM.CODE("020002000200020002000000010002000100000010000000300000001169690D"); |
SYSTEM.CODE("00000500B9000000100000001069690D00000300C30000000000000001000200"); |
SYSTEM.CODE("3C00000010000000000000001169690D00000400B9000000100000001069690D"); |
SYSTEM.CODE("00000200C300000000000000F09F14080601000060A02408050C000064A02408"); |
SYSTEM.CODE("0511000080A024080506000000A014080701000004A014080703000008A01408"); |
SYSTEM.CODE("070900000CA014080705000010A01408070A000014A01408070B000018A01408"); |
SYSTEM.CODE("070D00001CA01408070E000020A014080713000024A014080704000028A01408"); |
SYSTEM.CODE("070F00002CA014080710000030A014080707000034A01408071200005589E553"); |
SYSTEM.CODE("83EC04E8000000005B81C3CC1A10008B93FCFFFFFF85D27405E81E000000E88D"); |
SYSTEM.CODE("010000E878061000585BC9C3FF35F89F1408FF25FC9F140800000000FF2500A0"); |
SYSTEM.CODE("14086800000000E9E0FFFFFFFF2504A014086808000000E9D0FFFFFFFF2508A0"); |
SYSTEM.CODE("14086810000000E9C0FFFFFFFF250CA014086818000000E9B0FFFFFFFF2510A0"); |
SYSTEM.CODE("14086820000000E9A0FFFFFFFF2514A014086828000000E990FFFFFFFF2518A0"); |
SYSTEM.CODE("14086830000000E980FFFFFFFF251CA014086838000000E970FFFFFFFF2520A0"); |
SYSTEM.CODE("14086840000000E960FFFFFFFF2524A014086848000000E950FFFFFFFF2528A0"); |
SYSTEM.CODE("14086850000000E940FFFFFFFF252CA014086858000000E930FFFFFFFF2530A0"); |
SYSTEM.CODE("14086860000000E920FFFFFFFF2534A014086868000000E910FFFFFF00000000"); |
SYSTEM.CODE("31ED5E89E183E4F050545268B08B140868508B1408515668F4860408E80BFFFF"); |
SYSTEM.CODE("FFF490909090909090909090909090905589E55383EC04803D84A0240800753F"); |
SYSTEM.CODE("A188A02408BB189F140881EB149F1408C1FB0283EB0139D8731E8DB600000000"); |
SYSTEM.CODE("83C001A388A02408FF1485149F1408A188A0240839D872E8C60584A024080183"); |
SYSTEM.CODE("C4045B5DC38D7426008DBC27000000005589E583EC18A11C9F140885C07412B8"); |
SYSTEM.CODE("0000000085C07409C704241C9F1408FFD0C9C3905589E583E4F0565383EC38C7"); |
SYSTEM.CODE("44242CA0A024088B55088B44242C89108344242C048B550C8B44242C89108344"); |
SYSTEM.CODE("242C048B55108B44242C89108344242C04BACC8504088B44242C89108344242C"); |
SYSTEM.CODE("04BA8C8504088B44242C89108344242C04BA2C8604088B44242C89108344242C"); |
SYSTEM.CODE("04A164A0240889C28B44242C89108344242C04A180A0240889C28B44242C8910"); |
SYSTEM.CODE("8344242C04A160A0240889C28B44242C89108344242C04BA0C8604088B44242C"); |
SYSTEM.CODE("89108344242C04BA7C8504088B44242C89108344242C04BABC8504088B44242C"); |
SYSTEM.CODE("89108344242C04BAAC8504088B44242C89108344242C04BAFC8504088B44242C"); |
SYSTEM.CODE("89108344242C04BA1C8604088B44242C89108344242C04BA9C8504088B44242C"); |
SYSTEM.CODE("89108344242C04BADC8504088B44242C89108344242C048B35B8A02408BBF486"); |
SYSTEM.CODE("0408B9A0A02408BA60A01408B8108C140889742410895C240C894C2408895424"); |
SYSTEM.CODE("04890424E8B9FAEFFFB80000000083C4385B5E89EC5DC3909090909090909090"); |
SYSTEM.CODE("9090909090905589E5575653E85A00000081C39914000083EC1CE8B3F9EFFF8D"); |
SYSTEM.CODE("BB18FFFFFF8D8318FFFFFF29C7C1FF0285FF742431F68B4510894424088B450C"); |
SYSTEM.CODE("894424048B4508890424FF94B318FFFFFF83C60139FE72DE83C41C5B5E5F5DC3"); |
SYSTEM.CODE("8DB6000000005589E55DC38B1C24C3909090909090905589E55383EC04A10C9F"); |
SYSTEM.CODE("140883F8FF7413BB0C9F1408669083EB04FFD08B0383F8FF75F483C4045B5DC3"); |
SYSTEM.CODE("90905589E55383EC04E8000000005B81C3FC130000E86CFAEFFF595BC9C30300"); |
SYSTEM.CODE("00000100020025750A25750A25750A25750A0000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000FFFFFFFF00000000FFFFFFFF000000000000000001000000010000000100"); |
SYSTEM.CODE("00003C0000000C0000001C8504080D000000EC8B1408F5FEFF6F8C8104080500"); |
SYSTEM.CODE("00003483040806000000F48104080A000000CD0000000B000000100000001500"); |
SYSTEM.CODE("00000000000003000000F49F1408020000007000000014000000110000001700"); |
SYSTEM.CODE("0000AC840408110000008C84040812000000200000001300000008000000FEFF"); |
SYSTEM.CODE("FF6F2C840408FFFFFF6F02000000F0FFFF6F0284040800000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("00000000000000000000209F1408000000000000000062850408728504088285"); |
SYSTEM.CODE("040892850408A2850408B2850408C2850408D2850408E2850408F28504080286"); |
SYSTEM.CODE("0408128604082286040832860408000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000004743433A20285562756E74"); |
SYSTEM.CODE("752F4C696E61726F20342E352E322D387562756E7475342920342E352E320047"); |
SYSTEM.CODE("43433A20285562756E74752F4C696E61726F20342E352E322D387562756E7475"); |
SYSTEM.CODE("332920342E352E3200002E73796D746162002E737472746162002E7368737472"); |
SYSTEM.CODE("746162002E696E74657270002E6E6F74652E4142492D746167002E6E6F74652E"); |
SYSTEM.CODE("676E752E6275696C642D6964002E676E752E68617368002E64796E73796D002E"); |
SYSTEM.CODE("64796E737472002E676E752E76657273696F6E002E676E752E76657273696F6E"); |
SYSTEM.CODE("5F72002E72656C2E64796E002E72656C2E706C74002E696E6974002E74657874"); |
SYSTEM.CODE("002E66696E69002E726F64617461002E65685F6672616D65002E63746F727300"); |
SYSTEM.CODE("2E64746F7273002E6A6372002E64796E616D6963002E676F74002E676F742E70"); |
SYSTEM.CODE("6C74002E64617461002E627373002E636F6D6D656E7400000000000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000000000000000000000000000"); |
SYSTEM.CODE("001B000000010000000200000034810408340100001300000000000000000000"); |
SYSTEM.CODE("0001000000000000002300000007000000020000004881040848010000200000"); |
SYSTEM.CODE("0000000000000000000400000000000000310000000700000002000000688104"); |
SYSTEM.CODE("0868010000240000000000000000000000040000000000000044000000F6FFFF"); |
SYSTEM.CODE("6F020000008C8104088C01000068000000050000000000000004000000040000"); |
SYSTEM.CODE("004E0000000B00000002000000F4810408F40100004001000006000000010000"); |
SYSTEM.CODE("0004000000100000005600000003000000020000003483040834030000CD0000"); |
SYSTEM.CODE("00000000000000000001000000000000005E000000FFFFFF6F02000000028404"); |
SYSTEM.CODE("080204000028000000050000000000000002000000020000006B000000FEFFFF"); |
SYSTEM.CODE("6F020000002C8404082C04000060000000060000000200000004000000000000"); |
SYSTEM.CODE("007A00000009000000020000008C8404088C0400002000000005000000000000"); |
SYSTEM.CODE("000400000008000000830000000900000002000000AC840408AC040000700000"); |
SYSTEM.CODE("00050000000C00000004000000080000008C00000001000000060000001C8504"); |
SYSTEM.CODE("081C050000300000000000000000000000040000000000000087000000010000"); |
SYSTEM.CODE("00060000004C8504084C050000F0000000000000000000000004000000040000"); |
SYSTEM.CODE("009200000001000000060000004086040840060000AC05100000000000000000"); |
SYSTEM.CODE("001000000000000000980000000100000006000000EC8B1408EC0B10001C0000"); |
SYSTEM.CODE("00000000000000000004000000000000009E0000000100000002000000088C14"); |
SYSTEM.CODE("08080C10001500000000000000000000000400000000000000A6000000010000"); |
SYSTEM.CODE("0002000000208C1408200C100004000000000000000000000004000000000000"); |
SYSTEM.CODE("00B000000001000000030000000C9F14080C0F10000800000000000000000000"); |
SYSTEM.CODE("000400000000000000B70000000100000003000000149F1408140F1000080000"); |
SYSTEM.CODE("0000000000000000000400000000000000BE00000001000000030000001C9F14"); |
SYSTEM.CODE("081C0F10000400000000000000000000000400000000000000C3000000060000"); |
SYSTEM.CODE("0003000000209F1408200F1000D0000000060000000000000004000000080000"); |
SYSTEM.CODE("00CC0000000100000003000000F09F1408F00F10000400000000000000000000"); |
SYSTEM.CODE("000400000004000000D10000000100000003000000F49F1408F40F1000440000"); |
SYSTEM.CODE("0000000000000000000400000004000000DA000000010000000300000040A014"); |
SYSTEM.CODE("08401010002000100000000000000000002000000000000000E0000000080000"); |
SYSTEM.CODE("000300000060A02408601020004000800C000000000000000020000000000000"); |
SYSTEM.CODE("00E5000000010000003000000000000000601020005400000000000000000000"); |
SYSTEM.CODE("00010000000100000011000000030000000000000000000000B4102000EE0000"); |
SYSTEM.CODE("0000000000000000000100000000000000010000000200000000000000000000"); |
SYSTEM.CODE("002C162000000500001C0000002C000000040000001000000009000000030000"); |
SYSTEM.CODE("0000000000000000002C1B2000F9020000000000000000000001000000000000"); |
SYSTEM.CODE("0000000000000000000000000000000000000000003481040800000000030001"); |
SYSTEM.CODE("0000000000488104080000000003000200000000006881040800000000030003"); |
SYSTEM.CODE("00000000008C810408000000000300040000000000F481040800000000030005"); |
SYSTEM.CODE("0000000000348304080000000003000600000000000284040800000000030007"); |
SYSTEM.CODE("00000000002C8404080000000003000800000000008C84040800000000030009"); |
SYSTEM.CODE("0000000000AC8404080000000003000A00000000001C8504080000000003000B"); |
SYSTEM.CODE("00000000004C8504080000000003000C0000000000408604080000000003000D"); |
SYSTEM.CODE("0000000000EC8B14080000000003000E0000000000088C14080000000003000F"); |
SYSTEM.CODE("0000000000208C14080000000003001000000000000C9F140800000000030011"); |
SYSTEM.CODE("0000000000149F14080000000003001200000000001C9F140800000000030013"); |
SYSTEM.CODE("0000000000209F1408000000000300140000000000F09F140800000000030015"); |
SYSTEM.CODE("0000000000F49F140800000000030016000000000040A0140800000000030017"); |
SYSTEM.CODE("000000000060A024080000000003001800000000000000000000000000030019"); |
SYSTEM.CODE("000100000000000000000000000400F1FF0C0000000C9F140800000000010011"); |
SYSTEM.CODE("001A000000149F14080000000001001200280000001C9F140800000000010013"); |
SYSTEM.CODE("0035000000708604080000000002000D004B00000084A0240801000000010018"); |
SYSTEM.CODE("005A00000088A02408040000000100180068000000D08604080000000002000D"); |
SYSTEM.CODE("000100000000000000000000000400F1FF74000000109F140800000000010011"); |
SYSTEM.CODE("0081000000208C140800000000010010008F0000001C9F140800000000010013"); |
SYSTEM.CODE("009B000000C08B14080000000002000D00B100000000000000000000000400F1"); |
SYSTEM.CODE("FFB8000000F49F14080000000001001600CE0000000C9F140800000000000011"); |
SYSTEM.CODE("00DF0000000C9F14080000000000001100F2000000209F140800000000010014"); |
SYSTEM.CODE("00FB00000040A01408000000002000170006010000B08B14080500000012000D"); |
SYSTEM.CODE("0016010000408604080000000012000D001D0100000000000000000000200000"); |
SYSTEM.CODE("002C01000000000000000000002000000040010000088C14080400000011000F"); |
SYSTEM.CODE("0047010000EC8B14080000000012000E004D0100000000000000000000120000"); |
SYSTEM.CODE("006A0100000C8C14080400000011000F00790100007C85040800000000120000"); |
SYSTEM.CODE("0089010000A0A024080000800C110018008E01000040A0140800000000100017"); |
SYSTEM.CODE("009B0100008C8504080000000012000000AC0100009C85040800000000120000"); |
SYSTEM.CODE("00BD010000AC8504080000000012000000CF01000060A0240804000000110018"); |
SYSTEM.CODE("00E1010000BC8504080000000012000000F201000044A0140800000000110217"); |
SYSTEM.CODE("00FF010000CC850408000000001200000011020000DC85040800000000120000"); |
SYSTEM.CODE("0022020000189F140800000000110212002F020000508B14085A00000012000D"); |
SYSTEM.CODE("003F02000000000000000000001200000051020000FC85040800000000120000"); |
SYSTEM.CODE("006302000060A02408000000001000F1FF6F0200000C86040800000000120000"); |
SYSTEM.CODE("008102000060A0140800001000110017008702000064A0240804000000110018"); |
SYSTEM.CODE("0098020000A0A0A414000000001000F1FF9D02000080A0240804000000110018"); |
SYSTEM.CODE("00AF0200001C8604080000000012000000C002000060A02408000000001000F1"); |
SYSTEM.CODE("FFC70200002C8604080000000012000000D7020000B58B14080000000012020D"); |
SYSTEM.CODE("00EE020000F48604084D04100012000D00F30200001C8504080000000012000B"); |
SYSTEM.CODE("000063727473747566662E63005F5F43544F525F4C4953545F5F005F5F44544F"); |
SYSTEM.CODE("525F4C4953545F5F005F5F4A43525F4C4953545F5F005F5F646F5F676C6F6261"); |
SYSTEM.CODE("6C5F64746F72735F61757800636F6D706C657465642E363135350064746F725F"); |
SYSTEM.CODE("6964782E36313537006672616D655F64756D6D79005F5F43544F525F454E445F"); |
SYSTEM.CODE("5F005F5F4652414D455F454E445F5F005F5F4A43525F454E445F5F005F5F646F"); |
SYSTEM.CODE("5F676C6F62616C5F63746F72735F6175780070726F672E63005F474C4F42414C"); |
SYSTEM.CODE("5F4F46465345545F5441424C455F005F5F696E69745F61727261795F656E6400"); |
SYSTEM.CODE("5F5F696E69745F61727261795F7374617274005F44594E414D49430064617461"); |
SYSTEM.CODE("5F7374617274005F5F6C6962635F6373755F66696E69005F7374617274005F5F"); |
SYSTEM.CODE("676D6F6E5F73746172745F5F005F4A765F5265676973746572436C6173736573"); |
SYSTEM.CODE("005F66705F6877005F66696E69005F5F6C6962635F73746172745F6D61696E40"); |
SYSTEM.CODE("40474C4942435F322E30005F494F5F737464696E5F7573656400667265654040"); |
SYSTEM.CODE("474C4942435F322E300064617461005F5F646174615F737461727400646C7379"); |
SYSTEM.CODE("6D4040474C4942435F322E3000667365656B4040474C4942435F322E30006663"); |
SYSTEM.CODE("6C6F73654040474C4942435F322E31007374646572724040474C4942435F322E"); |
SYSTEM.CODE("3000666F70656E4040474C4942435F322E31005F5F64736F5F68616E646C6500"); |
SYSTEM.CODE("646C6F70656E4040474C4942435F322E31006674656C6C4040474C4942435F32"); |
SYSTEM.CODE("2E30005F5F44544F525F454E445F5F005F5F6C6962635F6373755F696E697400"); |
SYSTEM.CODE("7072696E74664040474C4942435F322E30006677726974654040474C4942435F"); |
SYSTEM.CODE("322E30005F5F6273735F7374617274006D616C6C6F634040474C4942435F322E"); |
SYSTEM.CODE("3000696461746100737464696E4040474C4942435F322E30005F656E64007374"); |
SYSTEM.CODE("646F75744040474C4942435F322E300066726561644040474C4942435F322E30"); |
SYSTEM.CODE("005F656461746100657869744040474C4942435F322E30005F5F693638362E67"); |
SYSTEM.CODE("65745F70635F7468756E6B2E6278006D61696E005F696E697400"); |
END data; |
IF n MOD _align # 0 THEN |
n := n + _align - (n MOD _align) |
END |
|
PROCEDURE get*(): INTEGER; |
RETURN SYSTEM.ADR(data) + 3 |
END get; |
RETURN n |
END align; |
|
|
PROCEDURE Write16 (file: FILE; w: WCHAR); |
BEGIN |
WR.Write16LE(file, ORD(w)) |
END Write16; |
|
|
PROCEDURE WritePH (file: FILE; ph: Elf32_Phdr); |
BEGIN |
WR.Write32LE(file, ph.p_type); |
WR.Write32LE(file, ph.p_offset); |
WR.Write32LE(file, ph.p_vaddr); |
WR.Write32LE(file, ph.p_paddr); |
WR.Write32LE(file, ph.p_filesz); |
WR.Write32LE(file, ph.p_memsz); |
WR.Write32LE(file, ph.p_flags); |
WR.Write32LE(file, ph.p_align) |
END WritePH; |
|
|
PROCEDURE WritePH64 (file: FILE; ph: Elf32_Phdr); |
BEGIN |
WR.Write32LE(file, ph.p_type); |
WR.Write32LE(file, ph.p_flags); |
WR.Write64LE(file, ph.p_offset); |
WR.Write64LE(file, ph.p_vaddr); |
WR.Write64LE(file, ph.p_paddr); |
WR.Write64LE(file, ph.p_filesz); |
WR.Write64LE(file, ph.p_memsz); |
WR.Write64LE(file, ph.p_align) |
END WritePH64; |
|
|
PROCEDURE fixup (program: BIN.PROGRAM; text, data, bss: INTEGER; amd64: BOOLEAN); |
VAR |
reloc: BIN.RELOC; |
L, delta: INTEGER; |
|
BEGIN |
reloc := program.rel_list.first(BIN.RELOC); |
WHILE reloc # NIL DO |
|
L := BIN.get32le(program.code, reloc.offset); |
delta := 3 - reloc.offset - text - 7 * ORD(amd64); |
|
CASE reloc.opcode OF |
|BIN.PICDATA: BIN.put32le(program.code, reloc.offset, L + data + delta) |
|BIN.PICCODE: BIN.put32le(program.code, reloc.offset, BIN.GetLabel(program, L) + text + delta) |
|BIN.PICBSS: BIN.put32le(program.code, reloc.offset, L + bss + delta) |
END; |
|
reloc := reloc.next(BIN.RELOC) |
END; |
END fixup; |
|
|
PROCEDURE write* (program: BIN.PROGRAM; FileName: ARRAY OF CHAR; amd64: BOOLEAN); |
CONST |
interp = 0; |
dyn = 1; |
header = 2; |
text = 3; |
data = 4; |
bss = 5; |
|
VAR |
ehdr: Elf32_Ehdr; |
phdr: ARRAY 16 OF Elf32_Phdr; |
|
i, LoadAdr, offset, pad, VA: INTEGER; |
|
SizeOf: RECORD header, code, data, bss: INTEGER END; |
|
File: FILE; |
|
str: ARRAY 40 OF CHAR; lstr: INTEGER; |
Dyn: ARRAY 350 OF BYTE; |
|
BEGIN |
IF amd64 THEN |
str := "/lib64/ld-linux-x86-64.so.2" |
ELSE |
str := "/lib/ld-linux.so.2" |
END; |
lstr := LENGTH(str); |
|
IF amd64 THEN |
LoadAdr := 400000H |
ELSE |
LoadAdr := 08048000H |
END; |
|
SizeOf.code := CHL.Length(program.code); |
SizeOf.data := CHL.Length(program.data); |
SizeOf.bss := program.bss; |
|
ehdr.e_ident[0] := 7FH; |
ehdr.e_ident[1] := ORD("E"); |
ehdr.e_ident[2] := ORD("L"); |
ehdr.e_ident[3] := ORD("F"); |
IF amd64 THEN |
ehdr.e_ident[4] := ELFCLASS64 |
ELSE |
ehdr.e_ident[4] := ELFCLASS32 |
END; |
ehdr.e_ident[5] := ELFDATA2LSB; |
ehdr.e_ident[6] := 1; |
ehdr.e_ident[7] := 3; |
FOR i := 8 TO EI_NIDENT - 1 DO |
ehdr.e_ident[i] := 0 |
END; |
|
ehdr.e_type := WCHR(ET_EXEC); |
ehdr.e_version := 1; |
ehdr.e_shoff := 0; |
ehdr.e_flags := 0; |
ehdr.e_shnum := WCHR(0); |
ehdr.e_shstrndx := WCHR(0); |
ehdr.e_phnum := WCHR(6); |
|
IF amd64 THEN |
ehdr.e_machine := WCHR(EM_8664); |
ehdr.e_phoff := 40H; |
ehdr.e_ehsize := WCHR(40H); |
ehdr.e_phentsize := WCHR(38H); |
ehdr.e_shentsize := WCHR(40H) |
ELSE |
ehdr.e_machine := WCHR(EM_386); |
ehdr.e_phoff := 34H; |
ehdr.e_ehsize := WCHR(34H); |
ehdr.e_phentsize := WCHR(20H); |
ehdr.e_shentsize := WCHR(28H) |
END; |
|
SizeOf.header := ORD(ehdr.e_ehsize) + ORD(ehdr.e_phentsize) * ORD(ehdr.e_phnum); |
|
phdr[interp].p_type := 3; |
phdr[interp].p_offset := SizeOf.header; |
phdr[interp].p_vaddr := LoadAdr + phdr[interp].p_offset; |
phdr[interp].p_paddr := LoadAdr + phdr[interp].p_offset; |
phdr[interp].p_filesz := lstr + 1; |
phdr[interp].p_memsz := lstr + 1; |
phdr[interp].p_flags := PF_R; |
phdr[interp].p_align := 1; |
|
phdr[dyn].p_type := 2; |
phdr[dyn].p_offset := phdr[interp].p_offset + phdr[interp].p_filesz; |
phdr[dyn].p_vaddr := LoadAdr + phdr[dyn].p_offset; |
phdr[dyn].p_paddr := LoadAdr + phdr[dyn].p_offset; |
IF amd64 THEN |
phdr[dyn].p_filesz := 0A0H; |
phdr[dyn].p_memsz := 0A0H |
ELSE |
phdr[dyn].p_filesz := 50H; |
phdr[dyn].p_memsz := 50H |
END; |
phdr[dyn].p_flags := PF_R; |
phdr[dyn].p_align := 1; |
|
offset := 0; |
|
phdr[header].p_type := 1; |
phdr[header].p_offset := offset; |
phdr[header].p_vaddr := LoadAdr; |
phdr[header].p_paddr := LoadAdr; |
IF amd64 THEN |
phdr[header].p_filesz := 305H; |
phdr[header].p_memsz := 305H |
ELSE |
phdr[header].p_filesz := 1D0H; |
phdr[header].p_memsz := 1D0H |
END; |
phdr[header].p_flags := PF_R + PF_W; |
phdr[header].p_align := 1000H; |
|
offset := offset + phdr[header].p_filesz; |
VA := LoadAdr + offset + 1000H; |
|
phdr[text].p_type := 1; |
phdr[text].p_offset := offset; |
phdr[text].p_vaddr := VA; |
phdr[text].p_paddr := VA; |
phdr[text].p_filesz := SizeOf.code; |
phdr[text].p_memsz := SizeOf.code; |
phdr[text].p_flags := PF_X + PF_R; |
phdr[text].p_align := 1000H; |
|
ehdr.e_entry := phdr[text].p_vaddr; |
|
offset := offset + phdr[text].p_filesz; |
VA := LoadAdr + offset + 2000H; |
pad := (16 - VA MOD 16) MOD 16; |
|
phdr[data].p_type := 1; |
phdr[data].p_offset := offset; |
phdr[data].p_vaddr := VA; |
phdr[data].p_paddr := VA; |
phdr[data].p_filesz := SizeOf.data + pad; |
phdr[data].p_memsz := SizeOf.data + pad; |
phdr[data].p_flags := PF_R + PF_W; |
phdr[data].p_align := 1000H; |
|
offset := offset + phdr[data].p_filesz; |
VA := LoadAdr + offset + 3000H; |
|
phdr[bss].p_type := 1; |
phdr[bss].p_offset := offset; |
phdr[bss].p_vaddr := VA; |
phdr[bss].p_paddr := VA; |
phdr[bss].p_filesz := 0; |
phdr[bss].p_memsz := SizeOf.bss + 16; |
phdr[bss].p_flags := PF_R + PF_W; |
phdr[bss].p_align := 1000H; |
|
fixup(program, phdr[text].p_vaddr, phdr[data].p_vaddr + pad, align(phdr[bss].p_vaddr, 16), amd64); |
|
File := WR.Create(FileName); |
|
FOR i := 0 TO EI_NIDENT - 1 DO |
WR.WriteByte(File, ehdr.e_ident[i]) |
END; |
|
Write16(File, ehdr.e_type); |
Write16(File, ehdr.e_machine); |
|
WR.Write32LE(File, ehdr.e_version); |
IF amd64 THEN |
WR.Write64LE(File, ehdr.e_entry); |
WR.Write64LE(File, ehdr.e_phoff); |
WR.Write64LE(File, ehdr.e_shoff) |
ELSE |
WR.Write32LE(File, ehdr.e_entry); |
WR.Write32LE(File, ehdr.e_phoff); |
WR.Write32LE(File, ehdr.e_shoff) |
END; |
WR.Write32LE(File, ehdr.e_flags); |
|
Write16(File, ehdr.e_ehsize); |
Write16(File, ehdr.e_phentsize); |
Write16(File, ehdr.e_phnum); |
Write16(File, ehdr.e_shentsize); |
Write16(File, ehdr.e_shnum); |
Write16(File, ehdr.e_shstrndx); |
|
IF amd64 THEN |
WritePH64(File, phdr[interp]); |
WritePH64(File, phdr[dyn]); |
WritePH64(File, phdr[header]); |
WritePH64(File, phdr[text]); |
WritePH64(File, phdr[data]); |
WritePH64(File, phdr[bss]) |
ELSE |
WritePH(File, phdr[interp]); |
WritePH(File, phdr[dyn]); |
WritePH(File, phdr[header]); |
WritePH(File, phdr[text]); |
WritePH(File, phdr[data]); |
WritePH(File, phdr[bss]) |
END; |
|
FOR i := 0 TO lstr DO |
WR.WriteByte(File, ORD(str[i])) |
END; |
|
i := 0; |
IF amd64 THEN |
BIN.InitArray(Dyn, i, "01000000000000000E000000000000000500000000000000DC02400000000000"); |
BIN.InitArray(Dyn, i, "0A00000000000000190000000000000006000000000000004C02400000000000"); |
BIN.InitArray(Dyn, i, "0B00000000000000180000000000000007000000000000009402400000000000"); |
BIN.InitArray(Dyn, i, "0800000000000000300000000000000009000000000000001800000000000000"); |
BIN.InitArray(Dyn, i, "0400000000000000C40240000000000000000000000000000000000000000000"); |
BIN.InitArray(Dyn, i, "0000000000000000000000000000000000000000000000000100000012000000"); |
BIN.InitArray(Dyn, i, "0000000000000000000000000000000008000000120000000000000000000000"); |
BIN.InitArray(Dyn, i, "0000000000000000F50240000000000001000000010000000000000000000000"); |
BIN.InitArray(Dyn, i, "FD02400000000000010000000200000000000000000000000100000003000000"); |
BIN.InitArray(Dyn, i, "0000000001000000020000000000000000646C6F70656E00646C73796D006C69"); |
BIN.InitArray(Dyn, i, "62646C2E736F2E320000000000000000000000000000000000") |
ELSE |
BIN.InitArray(Dyn, i, "010000000E00000005000000AF8104080A000000190000000600000057810408"); |
BIN.InitArray(Dyn, i, "0B00000010000000110000008781040812000000100000001300000008000000"); |
BIN.InitArray(Dyn, i, "0400000097810408000000000000000000000000000000000000000000000000"); |
BIN.InitArray(Dyn, i, "0100000000000000000000001200000008000000000000000000000012000000"); |
BIN.InitArray(Dyn, i, "C881040801010000CC8104080102000001000000030000000000000001000000"); |
BIN.InitArray(Dyn, i, "020000000000000000646C6F70656E00646C73796D006C6962646C2E736F2E32"); |
BIN.InitArray(Dyn, i, "000000000000000000") |
END; |
|
WR.Write(File, Dyn, i); |
|
CHL.WriteToFile(File, program.code); |
WHILE pad > 0 DO |
WR.WriteByte(File, 0); |
DEC(pad) |
END; |
CHL.WriteToFile(File, program.data); |
WR.Close(File) |
END write; |
|
|
END ELF. |