1 MODULE DswLinker486Main
;
3 IMPORT Kernel
, HostFiles
, Files
, Console
, Strings
,
4 LB
:= Dev2LnkBase
, Load
:= Dev2LnkLoad
, WrPe
:= Dev2LnkWritePe
,
5 WrElf
:= Dev2LnkWriteElf
, WrElfS
:= Dev2LnkWriteElfStatic
;
8 tgtElfStatic
= 0; tgtElfExe
= 1; tgtElfDll
= 2; tgtPeExe
= 3; tgtPeDll
= 4;
11 Elem
= POINTER TO RECORD
12 name
: ARRAY 256 OF CHAR;
19 outdir
, outname
: Files
.Name
;
20 os
, interp
, main
, kernel
: ARRAY 256 OF CHAR;
21 static
, dll
, sinit
: BOOLEAN;
23 PROCEDURE GetPath (IN path
: ARRAY OF CHAR; OUT dir
, name
: Files
.Name
);
24 VAR i
, j
, len
: INTEGER;
28 WHILE (i
>= 0) & (path
[i
] # '
/'
) DO DEC(i
) END;
30 FOR i
:= 0 TO i
- 1 DO
45 PROCEDURE InitOptions
;
46 VAR i
: INTEGER; h
, t
: Elem
; obj
: LB
.Directory
; p
: ARRAY 256 OF CHAR;
50 IF i
>= Kernel
.argc
THEN
51 Console
.WriteStr("required more parameters for ");
52 Console
.WriteStr(p
); Console
.WriteLn
;
59 WHILE i
< Kernel
.argc
DO
60 IF Kernel
.argv
[i
, 0] = "-" THEN
65 Strings
.ToLower(Kernel
.argv
[i
]$
, os
);
67 ELSIF p
= "-interp" THEN
69 interp
:= Kernel
.argv
[i
]$
;
73 GetPath(Kernel
.argv
[i
]$
, outdir
, outname
);
75 ELSIF p
= "-static" THEN
79 ELSIF p
= "-sinit" THEN
81 ELSIF (p
= "-m") OR (p
= "-main") THEN
83 main
:= Kernel
.argv
[i
]$
;
85 ELSIF (p
= "-k") OR (p
= "-kernel") THEN
87 kernel
:= Kernel
.argv
[i
]$
;
89 ELSIF p
= "-codedir" THEN
93 inobj
.path
:= Kernel
.argv
[i
]$
;
94 inobj
.legacy
:= FALSE
;
97 ELSIF p
= "-legacycodedir" THEN
101 inobj
.path
:= Kernel
.argv
[i
]$
;
102 inobj
.legacy
:= TRUE
;
105 ELSIF p
= "-trap" THEN
107 Kernel
.intTrap
:= TRUE
109 Console
.WriteStr("unknown option ");
110 Console
.WriteStr(p
); Console
.WriteLn
;
114 IF h
= NIL THEN NEW(h
); t
:= h
115 ELSE NEW(t
.next
); t
:= t
.next
117 t
.name
:= Kernel
.argv
[i
]$
;
124 PROCEDURE CheckOptions
;
126 IF (os
= "linux") OR (os
= "freebsd") OR (os
= "openbsd") THEN
127 IF dll
THEN LB
.Init(tgtElfDll
)
128 ELSIF static
THEN LB
.Init(tgtElfStatic
)
129 ELSE LB
.Init(tgtElfExe
)
131 LB
.dynaInit
:= ~sinit
;
133 LB
.opt
.OSABI
:= WrElf
.ELFOSABI_NONE
;
134 IF interp
= "" THEN LB
.opt
.elfInterpreter
:= WrElf
.linuxInterpreter
135 ELSE LB
.opt
.elfInterpreter
:= SHORT(interp$
)
137 ELSIF os
= "freebsd" THEN
138 LB
.opt
.OSABI
:= WrElf
.ELFOSABI_FREEBSD
;
139 IF interp
= "" THEN LB
.opt
.elfInterpreter
:= WrElf
.freeBSDInterpreter
140 ELSE LB
.opt
.elfInterpreter
:= SHORT(interp$
)
142 ELSIF os
= "openbsd" THEN
143 LB
.opt
.OSABI
:= WrElf
.ELFOSABI_NONE
;
144 IF interp
= "" THEN LB
.opt
.elfInterpreter
:= WrElf
.openBSDInterpreter
145 ELSE LB
.opt
.elfInterpreter
:= SHORT(interp$
)
151 Files
.dir
.GetFileName("a", "out", outname
)
153 ELSIF os
= "win32" THEN
154 IF dll
THEN LB
.Init(tgtPeDll
)
155 ELSE LB
.Init(tgtPeExe
)
157 LB
.dynaInit
:= ~sinit
;
159 Files
.dir
.GetFileName("a", "exe", outname
)
162 Console
.WriteStr("-static not supported for win32"); Console
.WriteLn
;
166 Console
.WriteStr("-interp not supported for win32"); Console
.WriteLn
;
170 Console
.WriteStr("os not specified"); Console
.WriteLn
;
173 Console
.WriteStr("unknown os "); Console
.WriteStr(os
); Console
.WriteLn
;
177 Console
.WriteStr("main module not specified"); Console
.WriteLn
;
181 Console
.WriteStr("required path to output file"); Console
.WriteLn
;
185 Console
.WriteStr("required path to input objects"); Console
.WriteLn
;
189 LB
.outputPath
:= outdir
;
190 LB
.outputName
:= SHORT(outname$
);
191 LB
.KernelName
:= SHORT(kernel$
);
192 LB
.mainName
:= SHORT(main$
);
194 Console
.WriteStr("no input specified"); Console
.WriteLn
;
200 VAR m
: Elem
; codeBase
, dataBase
, varsBase
: INTEGER;
205 | tgtElfStatic
, tgtElfExe
, tgtPeExe
: Load
.AddModule(m
.name
)
206 | tgtElfDll
, tgtPeDll
: Load
.ExportModule(m
.name
)
211 | tgtElfStatic
, tgtElfDll
, tgtPeDll
: (* ok *)
213 IF os
= "freebsd" THEN
214 Load
.ExportVariable(LB
.KernelName$
, "__progname");
215 Load
.ExportVariable(LB
.KernelName$
, "environ")
221 codeBase
:= 0; dataBase
:= 0; varsBase
:= 0;
225 WrPe
.GetBases(codeBase
, dataBase
, varsBase
);
226 LB
.SetAddr(codeBase
, dataBase
, varsBase
);
229 ELSIF LB
.outElf
& LB
.opt
.elfStatic
THEN
231 WrElfS
.GetBases(codeBase
, dataBase
, varsBase
);
232 LB
.SetAddr(codeBase
, dataBase
, varsBase
);
237 WrElf
.GetBases(codeBase
, dataBase
, varsBase
);
238 LB
.SetAddr(codeBase
, dataBase
, varsBase
);
243 Console
.WriteStr("link failed"); Console
.WriteLn
;
250 IF Kernel
.trapCount
# 0 THEN Kernel
.Quit(1) END;
251 HostFiles
.SetRootDir(".");
259 Kernel
.intTrap
:= FALSE
;
261 END DswLinker486Main
.