t_symbian.pas 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. {
  2. Copyright (c) 1998-2002 by Peter Vreman
  3. This unit implements support import,export,link routines
  4. for the (i386) Win32 target
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  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. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit t_symbian;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. cutils,cclasses,
  23. aasmbase,aasmtai,aasmdata,aasmcpu,fmodule,globtype,globals,systems,verbose,
  24. symconst,symdef,symsym,
  25. script,gendef,
  26. cpubase,
  27. import,export,link,cgobj,t_win, i_symbian;
  28. type
  29. TInternalLinkerSymbian = class(TInternalLinker)
  30. constructor create; override;
  31. procedure DefaultLinkScript; override;
  32. procedure InitSysInitUnitName; override;
  33. end;
  34. implementation
  35. uses
  36. SysUtils,
  37. cfileutils,
  38. cpuinfo,cgutils,dbgbase,
  39. owar,ogbase,ogcoff;
  40. {****************************************************************************
  41. TInternalLinkerSymbian
  42. ****************************************************************************}
  43. constructor TInternalLinkerSymbian.Create;
  44. begin
  45. inherited Create;
  46. CExeoutput:=TPECoffexeoutput;
  47. CObjInput:=TPECoffObjInput;
  48. end;
  49. procedure TInternalLinkerSymbian.DefaultLinkScript;
  50. var
  51. s,s2,
  52. ibase : TCmdStr;
  53. begin
  54. with LinkScript do
  55. begin
  56. while not ObjectFiles.Empty do
  57. begin
  58. s:=ObjectFiles.GetFirst;
  59. if s<>'' then
  60. Concat('READOBJECT '+MaybeQuoted(s));
  61. end;
  62. while not StaticLibFiles.Empty do
  63. begin
  64. s:=StaticLibFiles.GetFirst;
  65. if s<>'' then
  66. Concat('READSTATICLIBRARY '+MaybeQuoted(s));
  67. end;
  68. While not SharedLibFiles.Empty do
  69. begin
  70. S:=SharedLibFiles.GetFirst;
  71. if FindLibraryFile(s,target_info.staticClibprefix,target_info.staticClibext,s2) then
  72. Concat('READSTATICLIBRARY '+MaybeQuoted(s2))
  73. else
  74. Comment(V_Error,'Import library not found for '+S);
  75. end;
  76. if IsSharedLibrary then
  77. begin
  78. Concat('ISSHAREDLIBRARY');
  79. Concat('ENTRYNAME _E32DLL');
  80. end
  81. else
  82. begin
  83. Concat('ENTRYNAME _E32Startup')
  84. end;
  85. ibase:='';
  86. if assigned(DLLImageBase) then
  87. ibase:=DLLImageBase^
  88. else
  89. begin
  90. if IsSharedLibrary then
  91. ibase:='10000000'
  92. else
  93. ibase:='400000';
  94. end;
  95. Concat('IMAGEBASE $' + ibase);
  96. Concat('HEADER');
  97. Concat('EXESECTION .text');
  98. Concat(' OBJSECTION .text*');
  99. Concat(' SYMBOL ___CTOR_LIST__');
  100. Concat(' SYMBOL __CTOR_LIST__');
  101. Concat(' LONG -1');
  102. Concat(' OBJSECTION .ctor*');
  103. Concat(' LONG 0');
  104. Concat(' SYMBOL ___DTOR_LIST__');
  105. Concat(' SYMBOL __DTOR_LIST__');
  106. Concat(' LONG -1');
  107. Concat(' OBJSECTION .dtor*');
  108. Concat(' LONG 0');
  109. Concat(' SYMBOL etext');
  110. Concat('ENDEXESECTION');
  111. Concat('EXESECTION .data');
  112. Concat(' SYMBOL __data_start__');
  113. Concat(' OBJSECTION .data*');
  114. Concat(' OBJSECTION .fpc*');
  115. Concat(' SYMBOL edata');
  116. Concat(' SYMBOL __data_end__');
  117. Concat('ENDEXESECTION');
  118. Concat('EXESECTION .rdata');
  119. Concat(' SYMBOL ___RUNTIME_PSEUDO_RELOC_LIST__');
  120. Concat(' SYMBOL __RUNTIME_PSEUDO_RELOC_LIST__');
  121. Concat(' OBJSECTION .rdata_runtime_pseudo_reloc');
  122. Concat(' SYMBOL ___RUNTIME_PSEUDO_RELOC_LIST_END__');
  123. Concat(' SYMBOL __RUNTIME_PSEUDO_RELOC_LIST_END__');
  124. Concat(' OBJSECTION .rdata*');
  125. Concat(' OBJSECTION .rodata*');
  126. Concat('ENDEXESECTION');
  127. Concat('EXESECTION .pdata');
  128. Concat(' OBJSECTION .pdata');
  129. Concat('ENDEXESECTION');
  130. Concat('EXESECTION .bss');
  131. Concat(' SYMBOL __bss_start__');
  132. Concat(' OBJSECTION .bss*');
  133. Concat(' SYMBOL __bss_end__');
  134. Concat('ENDEXESECTION');
  135. Concat('EXESECTION .idata');
  136. Concat(' OBJSECTION .idata$2*');
  137. Concat(' OBJSECTION .idata$3*');
  138. Concat(' ZEROS 20');
  139. Concat(' OBJSECTION .idata$4*');
  140. Concat(' OBJSECTION .idata$5*');
  141. Concat(' OBJSECTION .idata$6*');
  142. Concat(' OBJSECTION .idata$7*');
  143. Concat('ENDEXESECTION');
  144. Concat('EXESECTION .edata');
  145. Concat(' OBJSECTION .edata*');
  146. Concat('ENDEXESECTION');
  147. Concat('EXESECTION .rsrc');
  148. Concat(' OBJSECTION .rsrc*');
  149. Concat('ENDEXESECTION');
  150. Concat('EXESECTION .reloc');
  151. Concat(' OBJSECTION .reloc');
  152. Concat('ENDEXESECTION');
  153. Concat('EXESECTION .stab');
  154. Concat(' OBJSECTION .stab');
  155. Concat('ENDEXESECTION');
  156. Concat('EXESECTION .stabstr');
  157. Concat(' OBJSECTION .stabstr');
  158. Concat('ENDEXESECTION');
  159. Concat('STABS');
  160. Concat('SYMBOLS');
  161. end;
  162. end;
  163. procedure TInternalLinkerSymbian.InitSysInitUnitName;
  164. begin
  165. sysinitunit := 'sysinitpas';
  166. end;
  167. {*****************************************************************************
  168. Initialize
  169. *****************************************************************************}
  170. initialization
  171. {$ifdef i386}
  172. RegisterExternalLinker(system_i386_symbian_info,TExternalLinkerWin);
  173. RegisterInternalLinker(system_i386_symbian_info,TInternalLinkerSymbian);
  174. RegisterImport(system_i386_symbian,TImportLibWin);
  175. RegisterExport(system_i386_symbian,TExportLibWin);
  176. RegisterDLLScanner(system_i386_symbian,TDLLScannerWin);
  177. // RegisterRes(res_gnu_windres_info);
  178. RegisterTarget(system_i386_symbian_info);
  179. {$endif i386}
  180. end.