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
108 Console
.WriteStr("unknown option ");
109 Console
.WriteStr(p
); Console
.WriteLn
;
113 IF h
= NIL THEN NEW(h
); t
:= h
114 ELSE NEW(t
.next
); t
:= t
.next
116 t
.name
:= Kernel
.argv
[i
]$
;
123 PROCEDURE CheckOptions
;
125 IF (os
= "linux") OR (os
= "freebsd") OR (os
= "openbsd") THEN
126 IF dll
THEN LB
.Init(tgtElfDll
)
127 ELSIF static
THEN LB
.Init(tgtElfStatic
)
128 ELSE LB
.Init(tgtElfExe
)
130 LB
.dynaInit
:= ~sinit
;
132 LB
.opt
.OSABI
:= WrElf
.ELFOSABI_NONE
;
133 IF interp
= "" THEN LB
.opt
.elfInterpreter
:= WrElf
.linuxInterpreter
134 ELSE LB
.opt
.elfInterpreter
:= SHORT(interp$
)
136 ELSIF os
= "freebsd" THEN
137 LB
.opt
.OSABI
:= WrElf
.ELFOSABI_FREEBSD
;
138 IF interp
= "" THEN LB
.opt
.elfInterpreter
:= WrElf
.freeBSDInterpreter
139 ELSE LB
.opt
.elfInterpreter
:= SHORT(interp$
)
141 ELSIF os
= "openbsd" THEN
142 LB
.opt
.OSABI
:= WrElf
.ELFOSABI_NONE
;
143 IF interp
= "" THEN LB
.opt
.elfInterpreter
:= WrElf
.openBSDInterpreter
144 ELSE LB
.opt
.elfInterpreter
:= SHORT(interp$
)
150 Files
.dir
.GetFileName("a", "out", outname
)
152 ELSIF os
= "win32" THEN
153 IF dll
THEN LB
.Init(tgtPeDll
)
154 ELSE LB
.Init(tgtPeExe
)
156 LB
.dynaInit
:= ~sinit
;
158 Files
.dir
.GetFileName("a", "exe", outname
)
161 Console
.WriteStr("-static not supported for win32"); Console
.WriteLn
;
165 Console
.WriteStr("-interp not supported for win32"); Console
.WriteLn
;
169 Console
.WriteStr("os not specified"); Console
.WriteLn
;
172 Console
.WriteStr("unknown os "); Console
.WriteStr(os
); Console
.WriteLn
;
176 Console
.WriteStr("main module not specified"); Console
.WriteLn
;
180 Console
.WriteStr("required path to output file"); Console
.WriteLn
;
184 Console
.WriteStr("required path to input objects"); Console
.WriteLn
;
188 LB
.outputPath
:= outdir
;
189 LB
.outputName
:= SHORT(outname$
);
190 LB
.KernelName
:= SHORT(kernel$
);
191 LB
.mainName
:= SHORT(main$
);
193 Console
.WriteStr("no input specified"); Console
.WriteLn
;
199 VAR m
: Elem
; codeBase
, dataBase
, varsBase
: INTEGER;
204 | tgtElfStatic
, tgtElfExe
, tgtPeExe
: Load
.AddModule(m
.name
)
205 | tgtElfDll
, tgtPeDll
: Load
.ExportModule(m
.name
)
210 | tgtElfStatic
, tgtElfDll
, tgtPeDll
: (* ok *)
212 IF os
= "freebsd" THEN
213 Load
.ExportVariable(LB
.KernelName$
, "__progname");
214 Load
.ExportVariable(LB
.KernelName$
, "environ")
220 codeBase
:= 0; dataBase
:= 0; varsBase
:= 0;
224 WrPe
.GetBases(codeBase
, dataBase
, varsBase
);
225 LB
.SetAddr(codeBase
, dataBase
, varsBase
);
228 ELSIF LB
.outElf
& LB
.opt
.elfStatic
THEN
230 WrElfS
.GetBases(codeBase
, dataBase
, varsBase
);
231 LB
.SetAddr(codeBase
, dataBase
, varsBase
);
236 WrElf
.GetBases(codeBase
, dataBase
, varsBase
);
237 LB
.SetAddr(codeBase
, dataBase
, varsBase
);
242 Console
.WriteStr("link failed"); Console
.WriteLn
;
249 IF Kernel
.trapCount
# 0 THEN Kernel
.Quit(1) END;
250 HostFiles
.SetRootDir(".");
259 END DswLinker486Main
.