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++) |