From 410a5db3d48e84f2157c2c4f4bc29056c0e174b9 Mon Sep 17 00:00:00 2001 From: Bernhard Schommer Date: Fri, 24 Jun 2016 13:57:27 +0200 Subject: Moved assembler and linker into own files. The function to call the assembler and the linker are now in own files like the preprocessor. Bug 19197 --- driver/Linker.ml | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 driver/Linker.ml (limited to 'driver/Linker.ml') diff --git a/driver/Linker.ml b/driver/Linker.ml new file mode 100644 index 00000000..501a2ae3 --- /dev/null +++ b/driver/Linker.ml @@ -0,0 +1,81 @@ +(* *********************************************************************) +(* *) +(* The Compcert verified compiler *) +(* *) +(* Xavier Leroy, INRIA Paris-Rocquencourt *) +(* Bernhard Schommer, AbsInt Angewandte Informatik GmbH *) +(* *) +(* Copyright Institut National de Recherche en Informatique et en *) +(* Automatique. All rights reserved. This file is distributed *) +(* under the terms of the INRIA Non-Commercial License Agreement. *) +(* *) +(* *********************************************************************) + +open Clflags +open Commandline +open Driveraux + + +(* Linking *) + +let linker exe_name files = + let cmd = List.concat [ + Configuration.linker; + ["-o"; exe_name]; + files; + (if Configuration.has_runtime_lib + then ["-L" ^ !stdlib_path; "-lcompcert"] + else []) + ] in + let exc = command cmd in + if exc <> 0 then begin + command_error "linker" exc; + exit 2 + end + + +let gnu_linker_help = +" -nostartfiles Do not use the standard system startup files when\n\ +\ linking\n\ +\ -nodefaultlibs Do not use the standard system libraries when\n\ +\ linking\n\ +\ -nostdlib Do not use the standard system startup files or\n\ +\ libraries when linking\n" + +let linker_help = +"Linking options:\n\ +\ -l Link library \n\ +\ -L Add to search path for libraries\n" ^ + (if gnu_system then gnu_linker_help else "") ^ +" -s Remove all symbol table and relocation information from the\n\ +\ executable\n\ +\ -static Prevent linking with the shared libraries\n\ +\ -T Use as linker command file\n\ +\ -Wl, Pass option to the linker\n\ +\ -WUl, Pass option to the gcc or dcc used for linking\n\ +\ -Xlinker Pass as an option to the linker\n\ +\ -u Pretend the symbol is undefined to force linking of\n\ +\ library modules to define it.\n" + +let linker_actions = + [ Prefix "-l", Self push_linker_arg; + Prefix "-L", Self push_linker_arg; ] @ + if gnu_system then + [ Exact "-nostartfiles", Self push_linker_arg; + Exact "-nodefaultlibs", Self push_linker_arg; + Exact "-nostdlib", Self push_linker_arg;] + else [] @ + [ Exact "-s", Self push_linker_arg; + Exact "-static", Self push_linker_arg; + Exact "-T", String (fun s -> if gnu_system then begin + push_linker_arg ("-T"); + push_linker_arg(s) + end else + push_linker_arg ("-Wm"^s)); + Exact "-Xlinker", String (fun s -> if Configuration.system = "diab" then + push_linker_arg ("-Wl,"^s) + else + push_linker_arg s); + Prefix "-Wl,", Self push_linker_arg; + Prefix "-WUl,", Self (fun s -> List.iter push_linker_arg (explode_comma_option s)); + Exact "-u", Self push_linker_arg;] -- cgit