dxeload.pp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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)] 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.7 2004-09-15 19:20:51 hajny
  81. * dxegen compilable for any target now
  82. Revision 1.6 2002/09/07 16:01:18 peter
  83. * old logs removed and tabs fixed
  84. Revision 1.5 2002/04/27 07:58:23 peter
  85. * fixed 2gb limit
  86. }