Rev 7 | Rev 10 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7 | Rev 8 | ||
---|---|---|---|
Line 53... | Line 53... | ||
53 | #else |
53 | #else |
54 | #error unsupported platform (not x86_64, not aarch64le). Please implement! |
54 | #error unsupported platform (not x86_64, not aarch64le). Please implement! |
55 | #endif |
55 | #endif |
56 | #define COMPILER "clang" |
56 | #define COMPILER "clang" |
57 | #define LINKER TARGET_TRIPLE "-ld" |
57 | #define LINKER TARGET_TRIPLE "-ld" |
- | 58 | //#define LINKER "ld.lld" |
|
58 | 59 | ||
59 | 60 | ||
60 | #define ARGMODE_SINGLE 0 |
61 | #define ARGMODE_SINGLE 0 |
61 | #define ARGMODE_HASVAL 1 |
62 | #define ARGMODE_HASVAL 1 |
62 | #define ARGMODE_EQUALVAL 2 |
63 | #define ARGMODE_EQUALVAL 2 |
Line 165... | Line 166... | ||
165 | || ARGV_CONTAINS_SINGLEARG ("-c") |
166 | || ARGV_CONTAINS_SINGLEARG ("-c") |
166 | || ARGV_CONTAINS_SINGLEARG ("-M") |
167 | || ARGV_CONTAINS_SINGLEARG ("-M") |
167 | || ARGV_CONTAINS_SINGLEARG ("-MM") |
168 | || ARGV_CONTAINS_SINGLEARG ("-MM") |
168 | || ARGV_CONTAINS_SINGLEARG ("-E") |
169 | || ARGV_CONTAINS_SINGLEARG ("-E") |
169 | || ARGV_CONTAINS_SINGLEARG ("-S")) |
170 | || ARGV_CONTAINS_SINGLEARG ("-S")) |
- | 171 | { |
|
- | 172 | if (ARGV_CONTAINS_SINGLEARG ("-c")) |
|
- | 173 | for (arg_index = 1; arg_index < argc; arg_index++) |
|
- | 174 | if (strcmp (argv[arg_index], "-shared") == 0) |
|
- | 175 | argv[arg_index] = ""; // HACK for GNU autotools: when compiling, wipe out the -shared flag to avoid a warning |
|
170 | execvpe (COMPILER, argv, envp); // by leaving argv[0] untouched, we will be invoking Clang as 'gcc', which will give it a supplemental hint about how to behave |
176 | execvpe (COMPILER, argv, envp); // by leaving argv[0] untouched, we will be invoking Clang as 'gcc', which will give it a supplemental hint about how to behave |
- | 177 | } |
|
171 | 178 | ||
172 | // collect source and object files in two separate lists |
179 | // collect source and object files in two separate lists |
173 | for (arg_index = 1; arg_index < argc; arg_index++) |
180 | for (arg_index = 1; arg_index < argc; arg_index++) |
174 | if ((strcmp (argv[arg_index - 1], "-o") != 0) // this arg is NOT preceded by "-o"... |
181 | if ((strcmp (argv[arg_index - 1], "-o") != 0) // this arg is NOT preceded by "-o"... |
175 | && (access (argv[arg_index], 0) == 0) // ... this arg is an existing file... |
182 | && (access (argv[arg_index], 0) == 0) // ... this arg is an existing file... |
Line 189... | Line 196... | ||
189 | ADD_O_ARG (argv[arg_index]); // this file is NOT one of the known file extensions: add to object files list |
196 | ADD_O_ARG (argv[arg_index]); // this file is NOT one of the known file extensions: add to object files list |
190 | } |
197 | } |
191 | 198 | ||
192 | // if we have zero .o file, OR if we have some source files, we have to compile first |
199 | // if we have zero .o file, OR if we have some source files, we have to compile first |
193 | if ((sarg_count > 0) || (oarg_count == 0)) |
200 | if ((sarg_count > 0) || (oarg_count == 0)) |
- | 201 | { |
|
- | 202 | if (ARGV_CONTAINS_SINGLEARG ("-c")) |
|
- | 203 | for (arg_index = 1; arg_index < argc; arg_index++) |
|
- | 204 | if (strcmp (argv[arg_index], "-shared") == 0) |
|
- | 205 | argv[arg_index] = ""; // HACK for GNU autotools: when compiling, wipe out the -shared flag to avoid a warning |
|
194 | execvpe (COMPILER, argv, envp); // by leaving argv[0] untouched, we will be invoking Clang as 'gcc', which will give it a supplemental hint about how to behave |
206 | execvpe (COMPILER, argv, envp); // by leaving argv[0] untouched, we will be invoking Clang as 'gcc', which will give it a supplemental hint about how to behave |
- | 207 | } |
|
195 | 208 | ||
196 | // collect -l flags |
209 | // collect -l flags |
197 | for (arg_index = 1; arg_index < argc; arg_index++) |
210 | for (arg_index = 1; arg_index < argc; arg_index++) |
198 | if ((strncmp (argv[arg_index], "-l", 2) == 0) && ((argv[arg_index])[2] != 0)) |
211 | if ((strncmp (argv[arg_index], "-l", 2) == 0) && ((argv[arg_index])[2] != 0)) |
199 | ADD_L_ARG (argv[arg_index]); |
212 | ADD_L_ARG (argv[arg_index]); |
Line 282... | Line 295... | ||
282 | // "-zrelro " |
295 | // "-zrelro " |
283 | // "-znow " |
296 | // "-znow " |
284 | ADD_LINKER_ARG ("--warn-shared-textrel"); |
297 | ADD_LINKER_ARG ("--warn-shared-textrel"); |
285 | ADD_LINKER_ARG ("-zrelro"); |
298 | ADD_LINKER_ARG ("-zrelro"); |
286 | ADD_LINKER_ARG ("-znow"); |
299 | ADD_LINKER_ARG ("-znow"); |
- | 300 | ||
- | 301 | // since clang doesn't seem to generate .note.GNU-stack sections in output ELF files we explicitly specify the linker that we don't want an executable stack |
|
- | 302 | // TODO: fix this in clang itself |
|
- | 303 | ADD_LINKER_ARG ("-znoexecstack"); |
|
287 | 304 | ||
288 | #if IS_TARGET_INTEL |
305 | #if IS_TARGET_INTEL |
289 | // "%{shared:" "-G -dy -z text" "} " |
306 | // "%{shared:" "-G -dy -z text" "} " |
290 | if (ARGV_CONTAINS_SINGLEARG ("-shared")) |
307 | if (ARGV_CONTAINS_SINGLEARG ("-shared")) |
291 | { |
308 | { |
Line 1104... | Line 1121... | ||
1104 | ADD_LINKER_ARG ("-T"); |
1121 | ADD_LINKER_ARG ("-T"); |
1105 | ADD_LINKER_ARG (argv[++arg_index]); |
1122 | ADD_LINKER_ARG (argv[++arg_index]); |
1106 | } |
1123 | } |
1107 | else if ((strncmp (argv[arg_index], "-T", 2) == 0) && ((argv[arg_index])[2] != 0)) |
1124 | else if ((strncmp (argv[arg_index], "-T", 2) == 0) && ((argv[arg_index])[2] != 0)) |
1108 | ADD_LINKER_ARG (argv[arg_index]); |
1125 | ADD_LINKER_ARG (argv[arg_index]); |
1109 | - | ||
1110 | // since clang doesn't seem to generate .note.GNU-stack sections in output ELF files we explicitly specify the linker that we don't want an executable stack |
- | |
1111 | // TODO: fix this in clang itself |
- | |
1112 | ADD_LINKER_ARG ("-z"); |
- | |
1113 | ADD_LINKER_ARG ("noexecstack"); |
- | |
1114 | 1126 | ||
1115 | if (ARGV_CONTAINS_SINGLEARG ("-v") || (getenv ("DEBUG_LINKER_DRIVER") != NULL)) |
1127 | if (ARGV_CONTAINS_SINGLEARG ("-v") || (getenv ("DEBUG_LINKER_DRIVER") != NULL)) |
1116 | { |
1128 | { |
1117 | fputs ("LINKER DRIVER: CONSTRUCTED COMMAND LINE BEGIN\n", stderr); |
1129 | fputs ("LINKER DRIVER: CONSTRUCTED COMMAND LINE BEGIN\n", stderr); |
1118 | for (arg_index = 0; arg_index < linker_argc; arg_index++) |
1130 | for (arg_index = 0; arg_index < linker_argc; arg_index++) |