Subversion Repositories QNX 8.QNX8 linker driver

Rev

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