dxeload.pp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Pierre Muller,
  5. member of the Free Pascal development team.
  6. Unit to Load DXE files for Go32V2
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************
  13. }
  14. Unit dxeload;
  15. interface
  16. function dxe_load(filename : string) : pointer;
  17. implementation
  18. uses
  19. dxetype;
  20. function dxe_load(filename : string) : pointer;
  21. {
  22. Copyright (C) 1995 Charles Sandmann ([email protected])
  23. translated to Free Pascal by Pierre Muller
  24. }
  25. type
  26. { to avoid range check problems }
  27. pointer_array = array[0..maxlongint div sizeof(pointer)-1] of pointer;
  28. tpa = ^pointer_array;
  29. var
  30. dh : dxe_header;
  31. data : pchar;
  32. f : file;
  33. relocs : tpa;
  34. i : longint;
  35. addr : pcardinal;
  36. begin
  37. dxe_load:=nil;
  38. { open the file }
  39. assign(f,filename);
  40. {$I-}
  41. reset(f,1);
  42. {$I+}
  43. { quit if no file !! }
  44. if ioresult<>0 then
  45. exit;
  46. { load the header }
  47. blockread(f,dh,sizeof(dxe_header),i);
  48. if (i<>sizeof(dxe_header)) or (dh.magic<>DXE_MAGIC) then
  49. begin
  50. close(f);
  51. exit;
  52. end;
  53. { get memory for code }
  54. getmem(data,dh.element_size);
  55. if data=nil then
  56. exit;
  57. { get memory for relocations }
  58. getmem(relocs,dh.nrelocs*sizeof(pointer));
  59. if relocs=nil then
  60. begin
  61. freemem(data,dh.element_size);
  62. exit;
  63. end;
  64. { copy code }
  65. blockread(f,data^,dh.element_size);
  66. blockread(f,relocs^,dh.nrelocs*sizeof(pointer));
  67. close(f);
  68. { relocate internal references }
  69. for i:=0 to dh.nrelocs-1 do
  70. begin
  71. cardinal(addr):=cardinal(data)+cardinal(relocs^[i]);
  72. addr^:=addr^+cardinal(data);
  73. end;
  74. FreeMem(relocs,dh.nrelocs*sizeof(pointer));
  75. dxe_load:=pointer( dh.symbol_offset + cardinal(data));
  76. end;
  77. end.
  78. {
  79. $Log$
  80. Revision 1.8 2004-11-02 20:06:16 peter
  81. * data too large
  82. Revision 1.7 2004/09/15 19:20:51 hajny
  83. * dxegen compilable for any target now
  84. Revision 1.6 2002/09/07 16:01:18 peter
  85. * old logs removed and tabs fixed
  86. Revision 1.5 2002/04/27 07:58:23 peter
  87. * fixed 2gb limit
  88. }