t_symbian.pas 6.8 KB

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