blob: 6384e86a22faf1cf5aa897ff964bb9a562390d7e [file] [log] [blame]
Ben Cheng25b3c042013-11-20 14:45:36 -08001/* Copyright (C) 2001-2010, 2012 Red Hat, Inc.
2 This file is part of Red Hat elfutils.
3 Written by Ulrich Drepper <drepper@redhat.com>, 2001.
4
5 Red Hat elfutils is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by the
7 Free Software Foundation; version 2 of the License.
8
9 Red Hat elfutils is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
13
14 You should have received a copy of the GNU General Public License along
15 with Red Hat elfutils; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
17
18 Red Hat elfutils is an included package of the Open Invention Network.
19 An included package of the Open Invention Network is a package for which
20 Open Invention Network licensees cross-license their patents. No patent
21 license is granted, either expressly or impliedly, by designation as an
22 included package. Should you wish to participate in the Open Invention
23 Network licensing program, please visit www.openinventionnetwork.com
24 <http://www.openinventionnetwork.com>. */
25
26#ifdef HAVE_CONFIG_H
27# include <config.h>
28#endif
29
30#include <argp.h>
31#include <assert.h>
32#include <error.h>
33#include <fcntl.h>
34#include <libelf.h>
35#include <libintl.h>
36#include <locale.h>
37#include <mcheck.h>
38#include <stdio.h>
39#include <stdio_ext.h>
40#include <stdlib.h>
41#include <string.h>
42#include <unistd.h>
43
44#include <system.h>
45#include "ld.h"
46#include "list.h"
47
48
49/* Name and version of program. */
50static void print_version (FILE *stream, struct argp_state *state);
51ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
52
53/* Bug report address. */
54ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
55
56
57/* Values for the various options. */
58enum
59 {
60 ARGP_whole_archive = 300,
61 ARGP_no_whole_archive,
62 ARGP_static,
63 ARGP_dynamic,
64 ARGP_pagesize,
65 ARGP_rpath_link,
66 ARGP_runpath,
67 ARGP_runpath_link,
68 ARGP_version_script,
69 ARGP_gc_sections,
70 ARGP_no_gc_sections,
71 ARGP_no_undefined,
72 ARGP_conserve,
73 ARGP_as_needed,
74 ARGP_no_as_needed,
75 ARGP_eh_frame_hdr,
76 ARGP_hash_style,
77 ARGP_build_id,
78#if YYDEBUG
79 ARGP_yydebug,
80#endif
81 };
82
83
84/* Definitions of arguments for argp functions. */
85static const struct argp_option options[] =
86{
87 { NULL, 0, NULL, 0, N_("Input File Control:"), 0 },
88 { "whole-archive", ARGP_whole_archive, NULL, 0,
89 N_("Include whole archives in the output from now on."), 0 },
90 { "no-whole-archive", ARGP_no_whole_archive, NULL, 0,
91 N_("Stop including the whole archives in the output."), 0 },
92 { NULL, 'l', N_("FILE"), OPTION_HIDDEN, NULL, 0 },
93 { "start-group", '(', NULL, 0, N_("Start a group."), 0 },
94 { "end-group", ')', NULL, 0, N_("End a group."), 0 },
95 { NULL, 'L', N_("PATH"), 0,
96 N_("Add PATH to list of directories files are searched in."), 0 },
97 { "as-needed", ARGP_as_needed, NULL, 0,
98 N_("Only set DT_NEEDED for following dynamic libs if actually used"), 0 },
99 { "no-as-needed", ARGP_no_as_needed, NULL, 0,
100 N_("Always set DT_NEEDED for following dynamic libs"), 0 },
101 { "rpath-link", ARGP_rpath_link, "PATH", OPTION_HIDDEN, NULL, 0 },
102 { NULL, 'i', NULL, 0, N_("Ignore LD_LIBRARY_PATH environment variable."),
103 0 },
104
105 { NULL, 0, NULL, 0, N_("Output File Control:"), 0 },
106 { "output", 'o', N_("FILE"), 0, N_("Place output in FILE."), 0 },
107 { NULL, 'z', "KEYWORD", OPTION_HIDDEN, NULL, 0 },
108 { "-z nodefaultlib", '\0', NULL, OPTION_DOC,
109 N_("Object is marked to not use default search path at runtime."), 0 },
110 { "-z allextract", '\0', NULL, OPTION_DOC,
111 N_("Same as --whole-archive."), 0 },
112 { "-z defaultextract", '\0', NULL, OPTION_DOC, N_("\
113Default rules of extracting from archive; weak references are not enough."),
114 0 },
115 { "-z weakextract", '\0', NULL, OPTION_DOC,
116 N_("Weak references cause extraction from archive."), 0 },
117 { "-z muldefs", '\0', NULL, OPTION_DOC,
118 N_("Allow multiple definitions; first is used."), 0 },
119 { "-z defs | nodefs", '\0', NULL, OPTION_DOC,
120 N_("Disallow/allow undefined symbols in DSOs."), 0 },
121 { "no-undefined", ARGP_no_undefined, NULL, OPTION_HIDDEN, NULL, 0 },
122 { "-z origin", '\0', NULL, OPTION_DOC,
123 N_("Object requires immediate handling of $ORIGIN."), 0 },
124 { "-z now", '\0', NULL, OPTION_DOC,
125 N_("Relocation will not be processed lazily."), 0 },
126 { "-z nodelete", '\0', NULL, OPTION_DOC,
127 N_("Object cannot be unloaded at runtime."), 0 },
128 { "-z initfirst", '\0', NULL, OPTION_DOC,
129 N_("Mark object to be initialized first."), 0 },
130 { "-z lazyload | nolazyload", '\0', NULL, OPTION_DOC,
131 N_("Enable/disable lazy-loading flag for following dependencies."), 0 },
132 { "-z nodlopen", '\0', NULL, OPTION_DOC,
133 N_("Mark object as not loadable with 'dlopen'."), 0 },
134 { "-z ignore | record", '\0', NULL, OPTION_DOC,
135 N_("Ignore/record dependencies on unused DSOs."), 0 },
136 { "-z systemlibrary", '\0', NULL, OPTION_DOC,
137 N_("Generated DSO will be a system library."), 0 },
138 { "entry", 'e', N_("ADDRESS"), 0, N_("Set entry point address."), 0 },
139 { "static", ARGP_static, NULL, OPTION_HIDDEN, NULL, 0 },
140 { "-B static", ARGP_static, NULL, OPTION_DOC,
141 N_("Do not link against shared libraries."), 0 },
142 { "dynamic", ARGP_dynamic, NULL, OPTION_HIDDEN, NULL, 0 },
143 { "-B dynamic", ARGP_dynamic, NULL, OPTION_DOC,
144 N_("Prefer linking against shared libraries."), 0 },
145 { "export-dynamic", 'E', NULL, 0, N_("Export all dynamic symbols."), 0 },
146 { "strip-all", 's', NULL, 0, N_("Strip all symbols."), 0 },
147 { "strip-debug", 'S', NULL, 0, N_("Strip debugging symbols."), 0 },
148 { "pagesize", ARGP_pagesize, "SIZE", 0,
149 N_("Assume pagesize for the target system to be SIZE."), 0 },
150 { "rpath", 'R', "PATH", OPTION_HIDDEN, NULL, 0 },
151 { "runpath", ARGP_runpath, "PATH", 0, N_("Set runtime DSO search path."),
152 0 },
153 { "runpath-link", ARGP_runpath_link, "PATH", 0,
154 N_("Set link time DSO search path."), 0 },
155 { "shared", 'G', NULL, 0, N_("Generate dynamic shared object."), 0 },
156 { NULL, 'r', NULL, 0L, N_("Generate relocatable object."), 0 },
157 { NULL, 'B', "KEYWORD", OPTION_HIDDEN, "", 0 },
158 { "-B local", 'B', NULL, OPTION_DOC,
159 N_("Causes symbol not assigned to a version be reduced to local."), 0 },
160 { "gc-sections", ARGP_gc_sections, NULL, 0, N_("Remove unused sections."),
161 0 },
162 { "no-gc-sections", ARGP_no_gc_sections, NULL, 0,
163 N_("Don't remove unused sections."), 0 },
164 { "soname", 'h', "NAME", 0, N_("Set soname of shared object."), 0 },
165 { "dynamic-linker", 'I', "NAME", 0, N_("Set the dynamic linker name."), 0 },
166 { NULL, 'Q', "YN", OPTION_HIDDEN, NULL, 0 },
167 { "-Q y | n", 'Q', NULL, OPTION_DOC,
168 N_("Add/suppress addition indentifying link-editor to .comment section."),
169 0 },
170 { "eh-frame-hdr", ARGP_eh_frame_hdr, NULL, 0,
171 N_("Create .eh_frame_hdr section"), 0 },
172 { "hash-style", ARGP_hash_style, "STYLE", 0,
173 N_("Set hash style to sysv, gnu or both."), 0 },
174 { "build-id", ARGP_build_id, "STYLE", OPTION_ARG_OPTIONAL,
175 N_("Generate build ID note (md5, sha1 (default), uuid)."), 0 },
176
177 { NULL, 0, NULL, 0, N_("Linker Operation Control:"), 0 },
178 { "verbose", 'v', NULL, 0, N_("Verbose messages."), 0 },
179 { "trace", 't', NULL, 0, N_("Trace file opens."), 0 },
180 { "conserve-memory", ARGP_conserve, NULL, 0,
181 N_("Trade speed for less memory usage"), 0 },
182 { NULL, 'O', N_("LEVEL"), OPTION_ARG_OPTIONAL,
183 N_("Set optimization level to LEVEL."), 0 },
184 { NULL, 'c', N_("FILE"), 0, N_("Use linker script in FILE."), 0 },
185#if YYDEBUG
186 { "yydebug", ARGP_yydebug, NULL, 0,
187 N_("Select to get parser debug information"), 0 },
188#endif
189 { "version-script", ARGP_version_script, "FILE", 0,
190 N_("Read version information from FILE."), 0 },
191 { "emulation", 'm', "NAME", 0, N_("Set emulation to NAME."), 0 },
192
193 { NULL, 0, NULL, 0, NULL, 0 }
194};
195
196/* Short description of program. */
197static const char doc[] = N_("Combine object and archive files.");
198
199/* Strings for arguments in help texts. */
200static const char args_doc[] = N_("[FILE]...");
201
202/* Prototype for option handler. */
203static void replace_args (int argc, char *argv[]);
204static error_t parse_opt_1st (int key, char *arg, struct argp_state *state);
205static error_t parse_opt_2nd (int key, char *arg, struct argp_state *state);
206
207/* Data structure to communicate with argp functions. */
208static struct argp argp_1st =
209{
210 options, parse_opt_1st, args_doc, doc, NULL, NULL, NULL
211};
212static struct argp argp_2nd =
213{
214 options, parse_opt_2nd, args_doc, doc, NULL, NULL, NULL
215};
216
217
218/* Linker state. This contains all global information. */
219struct ld_state ld_state;
220
221/* List of the input files. */
222static struct file_list
223{
224 const char *name;
225 struct file_list *next;
226} *input_file_list;
227
228/* If nonzero be verbose. */
229int verbose;
230
231/* If nonzero, trade speed for less memory/address space usage. */
232int conserve_memory;
233
234/* The emulation name to use. */
235static const char *emulation;
236
237/* Keep track of the nesting level. Even though we don't handle nested
238 groups we still keep track to improve the error messages. */
239static int group_level;
240
241/* The last file we processed. */
242static struct usedfiles *last_file;
243
244/* The default linker script. */
245/* XXX We'll do this a bit different in the real solution. */
246static const char *linker_script = SRCDIR "/elf32-i386.script";
247
248/* Nonzero if an error occurred while loading the input files. */
249static int error_loading;
250
251
252/* Intermediate storage for the LD_LIBRARY_PATH information from the
253 environment. */
254static char *ld_library_path1;
255
256/* Flag used to communicate with the scanner. */
257int ld_scan_version_script;
258
259/* Name of the input file. */
260const char *ldin_fname;
261
262/* Define by parser if required. */
263extern int lddebug;
264
265
266/* Prototypes for local functions. */
267static void parse_z_option (const char *arg);
268static void parse_z_option_2 (const char *arg);
269static void parse_B_option (const char *arg);
270static void parse_B_option_2 (const char *arg);
271static void determine_output_format (void);
272static void load_needed (void);
273static void collect_sections (void);
274static void add_rxxpath (struct pathelement **pathp, const char *str);
275static void gen_rxxpath_data (void);
276static void read_version_script (const char *fname);
277static void create_lscript_symbols (void);
278static void create_special_section_symbol (struct symbol **symp,
279 const char *name);
280
281
282int
283main (int argc, char *argv[])
284{
285 int remaining;
286 int err;
287
288#ifndef NDEBUG
289 /* Enable memory debugging. */
290 mtrace ();
291#endif
292
293 /* Sanity check. We always want to use the LFS functionality. */
294 if (sizeof (off_t) != sizeof (off64_t))
295 abort ();
296
297 /* We use no threads here which can interfere with handling a stream. */
298 __fsetlocking (stdin, FSETLOCKING_BYCALLER);
299 __fsetlocking (stdout, FSETLOCKING_BYCALLER);
300 __fsetlocking (stderr, FSETLOCKING_BYCALLER);
301
302 /* Set locale. */
303 setlocale (LC_ALL, "");
304
305 /* Make sure the message catalog can be found. */
306 bindtextdomain (PACKAGE_TARNAME, LOCALEDIR);
307
308 /* Initialize the message catalog. */
309 textdomain (PACKAGE_TARNAME);
310
311 /* Before we start tell the ELF library which version we are using. */
312 elf_version (EV_CURRENT);
313
314 /* The user can use the LD_LIBRARY_PATH environment variable to add
315 additional lookup directories. */
316 ld_library_path1 = getenv ("LD_LIBRARY_PATH");
317
318 /* Initialize the memory handling. */
319#define obstack_chunk_alloc xmalloc
320#define obstack_chunk_free free
321 obstack_init (&ld_state.smem);
322
323 /* Recognize old-style parameters for compatibility. */
324 replace_args (argc, argv);
325
326 /* One quick pass over the parameters which allows us to scan for options
327 with global effect which influence the rest of the processing. */
328 argp_parse (&argp_1st, argc, argv, ARGP_IN_ORDER, &remaining, NULL);
329
330 /* We need at least one input file. */
331 if (input_file_list == NULL)
332 {
333 error (0, 0, gettext ("At least one input file needed"));
334 argp_help (&argp_1st, stderr, ARGP_HELP_SEE, "ld");
335 exit (EXIT_FAILURE);
336 }
337
338 /* Determine which ELF backend to use. */
339 determine_output_format ();
340
341 /* If no hash style was specific default to the oldand slow SysV
342 method. */
343 if (unlikely (ld_state.hash_style == hash_style_none))
344 ld_state.hash_style = hash_style_sysv;
345
346 /* Prepare state. */
347 err = ld_prepare_state (emulation);
348 if (err != 0)
349 error (EXIT_FAILURE, 0, gettext ("error while preparing linking"));
350
351 /* XXX Read the linker script now. Since we later will have the linker
352 script built in we don't go into trouble to make sure we handle GROUP
353 statements in the script. This simply must not happen. */
354 ldin = fopen (linker_script, "r");
355 if (ldin == NULL)
356 error (EXIT_FAILURE, errno, gettext ("cannot open linker script '%s'"),
357 linker_script);
358 /* No need for locking. */
359 __fsetlocking (ldin, FSETLOCKING_BYCALLER);
360
361 ld_state.srcfiles = NULL;
362 ldlineno = 1;
363 ld_scan_version_script = 0;
364 ldin_fname = linker_script;
365 if (ldparse () != 0)
366 /* Something went wrong during parsing. */
367 exit (EXIT_FAILURE);
368 fclose (ldin);
369
370 /* We now might have a list of directories to look for libraries in
371 named by the linker script. Put them in a different list so that
372 they are searched after all paths given by the user on the
373 command line. */
374 ld_state.default_paths = ld_state.paths;
375 ld_state.paths = ld_state.tailpaths = NULL;
376
377 /* Get runpath/rpath information in usable form. */
378 gen_rxxpath_data ();
379
380 /* Parse and process arguments for real. */
381 argp_parse (&argp_2nd, argc, argv, ARGP_IN_ORDER, &remaining, NULL);
382 /* All options should have been processed by the argp parser. */
383 assert (remaining == argc);
384
385 /* Process the last file. */
386 while (last_file != NULL)
387 /* Try to open the file. */
388 error_loading |= FILE_PROCESS (-1, last_file, &ld_state, &last_file);
389
390 /* Stop if there has been a problem while reading the input files. */
391 if (error_loading)
392 exit (error_loading);
393
394 /* See whether all opened -( were closed. */
395 if (group_level > 0)
396 {
397 error (0, 0, gettext ("-( without matching -)"));
398 argp_help (&argp_1st, stderr, ARGP_HELP_SEE, "ld");
399 exit (EXIT_FAILURE);
400 }
401
402 /* When we create a relocatable file we don't have to look for the
403 DT_NEEDED DSOs and we also don't test for undefined symbols. */
404 if (ld_state.file_type != relocatable_file_type)
405 {
406 /* At this point we have loaded all the direct dependencies. What
407 remains to be done is find the indirect dependencies. These are
408 DSOs which are referenced by the DT_NEEDED entries in the DSOs
409 which are direct dependencies. We have to transitively find and
410 load all these dependencies. */
411 load_needed ();
412
413 /* At this point all object files and DSOs are read. If there
414 are still undefined symbols left they might have to be
415 synthesized from the linker script. */
416 create_lscript_symbols ();
417
418 /* Now that we have loaded all the object files we can determine
419 whether we have any non-weak unresolved references left. If
420 there are any we stop. If the user used the '-z nodefs' option
421 and we are creating a DSO don't perform the tests. */
422 if (FLAG_UNRESOLVED (&ld_state) != 0)
423 exit (1);
424 }
425
426 /* Collect information about the relocations which will be carried
427 forward into the output. We have to do this here and now since
428 we need to know which sections have to be created. */
429 if (ld_state.file_type != relocatable_file_type)
430 {
431 void *p ;
432 struct scnhead *h;
433
434 p = NULL;
435 while ((h = ld_section_tab_iterate (&ld_state.section_tab, &p)) != NULL)
436 if (h->type == SHT_REL || h->type == SHT_RELA)
437 {
438 struct scninfo *runp = h->last;
439 do
440 {
441 /* If we are processing the relocations determine how
442 many will be in the output file. Also determine
443 how many GOT entries are needed. */
444 COUNT_RELOCATIONS (&ld_state, runp);
445
446 ld_state.relsize_total += runp->relsize;
447 }
448 while ((runp = runp->next) != h->last);
449 }
450 }
451
452 /* Not part of the gABI, but part of every psABI: the symbols for the
453 GOT section. Add the symbol if necessary. */
454 if (ld_state.need_got)
455 create_special_section_symbol (&ld_state.got_symbol,
456 "_GLOBAL_OFFSET_TABLE_");
457 /* Similarly for the _DYNAMIC symbol which points to the dynamic
458 section. */
459 if (dynamically_linked_p ())
460 create_special_section_symbol (&ld_state.dyn_symbol, "_DYNAMIC");
461
462 /* We are ready to start working on the output file. Not all
463 information has been gather or created yet. This will be done as
464 we go. Open the file now. */
465 if (OPEN_OUTFILE (&ld_state, EM_NONE, ELFCLASSNONE, ELFDATANONE) != 0)
466 exit (1);
467
468 /* Create the sections which are generated by the linker and are not
469 present in the input file. The output file must already have
470 been opened since we need the ELF descriptor to deduce type
471 sizes. */
472 GENERATE_SECTIONS (&ld_state);
473
474 /* At this point we have read all the files and know all the
475 sections which have to be linked into the application. We do now
476 create an array listing all the sections. We will than pass this
477 array to a system specific function which can reorder it at will.
478 The functions can also merge sections if this is what is
479 wanted. */
480 collect_sections ();
481
482 /* Create the output sections now. This may requires sorting them
483 first. */
484 CREATE_SECTIONS (&ld_state);
485
486 /* Create the output file data. Appropriate code for the selected
487 output file type is called. */
488 if (CREATE_OUTFILE (&ld_state) != 0)
489 exit (1);
490
491 /* Finalize the output file, write the data out. */
492 err |= FINALIZE (&ld_state);
493
494 /* Return with an non-zero exit status also if any error message has
495 been printed. */
496 return err | (error_message_count != 0);
497}
498
499
500static void
501replace_args (int argc, char *argv[])
502{
503 static const struct
504 {
505 const char *from;
506 const char *to;
507 } args[] =
508 {
509 { "-export-dynamic", "--export-dynamic" },
510 { "-dynamic-linker", "--dynamic-linker" },
511 { "-static", "--static" },
512 };
513 const size_t nargs = sizeof (args) / sizeof (args[0]);
514
515 for (int i = 1; i < argc; ++i)
516 if (argv[i][0] == '-' && islower (argv[i][1]) && argv[i][2] != '\0')
517 for (size_t j = 0; j < nargs; ++j)
518 if (strcmp (argv[i], args[j].from) == 0)
519 {
520 argv[i] = (char *) args[j].to;
521 break;
522 }
523}
524
525
526static int
527valid_hexarg (const char *arg)
528{
529 if (strncasecmp (arg, "0x", 2) != 0)
530 return 0;
531
532 arg += 2;
533 do
534 {
535 if (isxdigit (arg[0]) && isxdigit (arg[1]))
536 {
537 arg += 2;
538 if (arg[0] == '-' || arg[0] == ':')
539 ++arg;
540 }
541 else
542 return 0;
543 }
544 while (*arg != '\0');
545
546 return 1;
547}
548
549
550/* Quick scan of the parameter list for options with global effect. */
551static error_t
552parse_opt_1st (int key, char *arg,
553 struct argp_state *state __attribute__ ((unused)))
554{
555 switch (key)
556 {
557 case 'B':
558 parse_B_option (arg);
559 break;
560
561 case 'c':
562 linker_script = arg;
563 break;
564
565 case 'E':
566 ld_state.export_all_dynamic = true;
567 break;
568
569 case 'G':
570 if (ld_state.file_type != no_file_type)
571 error (EXIT_FAILURE, 0,
572 gettext ("only one option of -G and -r is allowed"));
573 ld_state.file_type = dso_file_type;
574
575 /* If we generate a DSO we have to export all symbols. */
576 ld_state.export_all_dynamic = true;
577 break;
578
579 case 'h':
580 ld_state.soname = arg;
581 break;
582
583 case 'i':
584 /* Discard the LD_LIBRARY_PATH value we found. */
585 ld_library_path1 = NULL;
586 break;
587
588 case 'I':
589 ld_state.interp = arg;
590 break;
591
592 case 'm':
593 if (emulation != NULL)
594 error (EXIT_FAILURE, 0, gettext ("more than one '-m' parameter"));
595 emulation = arg;
596 break;
597
598 case 'Q':
599 if (arg[1] == '\0' && (arg[0] == 'y' || arg[0] == 'Y'))
600 ld_state.add_ld_comment = true;
601 else if (arg[1] == '\0' && (arg[0] == 'n' || arg[0] == 'N'))
602 ld_state.add_ld_comment = true;
603 else
604 error (EXIT_FAILURE, 0, gettext ("unknown option `-%c %s'"), 'Q', arg);
605 break;
606
607 case 'r':
608 if (ld_state.file_type != no_file_type)
609 error (EXIT_FAILURE, 0,
610 gettext ("only one option of -G and -r is allowed"));
611 ld_state.file_type = relocatable_file_type;
612 break;
613
614 case 'S':
615 ld_state.strip = strip_debug;
616 break;
617
618 case 't':
619 ld_state.trace_files = true;
620 break;
621
622 case 'v':
623 verbose = 1;
624 break;
625
626 case 'z':
627 /* The SysV linker used 'z' to pass various flags to the linker.
628 We follow this. See 'parse_z_option' for the options we
629 recognize. */
630 parse_z_option (arg);
631 break;
632
633 case ARGP_pagesize:
634 {
635 char *endp;
636 ld_state.pagesize = strtoul (arg, &endp, 0);
637 if (*endp != '\0')
638 {
639 if (endp[1] == '\0' && tolower (*endp) == 'k')
640 ld_state.pagesize *= 1024;
641 else if (endp[1] == '\0' && tolower (*endp) == 'm')
642 ld_state.pagesize *= 1024 * 1024;
643 else
644 {
645 error (0, 0,
646 gettext ("invalid page size value '%s': ignored"),
647 arg);
648 ld_state.pagesize = 0;
649 }
650 }
651 }
652 break;
653
654 case 'R':
655 add_rxxpath (&ld_state.rpath, arg);
656 break;
657
658 case ARGP_rpath_link:
659 add_rxxpath (&ld_state.rpath_link, arg);
660 break;
661
662 case ARGP_runpath:
663 add_rxxpath (&ld_state.runpath, arg);
664 break;
665
666 case ARGP_runpath_link:
667 add_rxxpath (&ld_state.runpath_link, arg);
668 break;
669
670 case ARGP_gc_sections:
671 case ARGP_no_gc_sections:
672 ld_state.gc_sections = key == ARGP_gc_sections;
673 break;
674
675 case ARGP_eh_frame_hdr:
676 ld_state.eh_frame_hdr = true;
677 break;
678
679 case ARGP_hash_style:
680 if (strcmp (arg, "gnu") == 0)
681 ld_state.hash_style = hash_style_gnu;
682 else if (strcmp (arg, "both") == 0)
683 ld_state.hash_style = hash_style_gnu | hash_style_sysv;
684 else if (strcmp (arg, "sysv") == 0)
685 ld_state.hash_style = hash_style_sysv;
686 else
687 error (EXIT_FAILURE, 0, gettext ("invalid hash style '%s'"), arg);
688 break;
689
690 case ARGP_build_id:
691 if (arg == NULL)
692 ld_state.build_id = "sha1";
693 else if (strcmp (arg, "uuid") != 0
694 && strcmp (arg, "md5") != 0
695 && strcmp (arg, "sha1") != 0
696 && !valid_hexarg (arg))
697 error (EXIT_FAILURE, 0, gettext ("invalid build-ID style '%s'"), arg);
698 else
699 ld_state.build_id = arg;
700 break;
701
702 case 's':
703 if (arg == NULL)
704 {
705 if (ld_state.strip == strip_all)
706 ld_state.strip = strip_everything;
707 else
708 ld_state.strip = strip_all;
709 break;
710 }
711 /* FALLTHROUGH */
712
713 case 'e':
714 case 'o':
715 case 'O':
716 case ARGP_whole_archive:
717 case ARGP_no_whole_archive:
718 case ARGP_as_needed:
719 case ARGP_no_as_needed:
720 case 'L':
721 case '(':
722 case ')':
723 case 'l':
724 case ARGP_static:
725 case ARGP_dynamic:
726 case ARGP_version_script:
727 /* We'll handle these in the second pass. */
728 break;
729
730 case ARGP_KEY_ARG:
731 {
732 struct file_list *newp;
733
734 newp = (struct file_list *) xmalloc (sizeof (struct file_list));
735 newp->name = arg;
736#ifndef NDEBUG
737 newp->next = NULL;
738#endif
739 CSNGL_LIST_ADD_REAR (input_file_list, newp);
740 }
741 break;
742
743#if YYDEBUG
744 case ARGP_yydebug:
745 lddebug = 1;
746 break;
747#endif
748
749 case ARGP_no_undefined:
750 ld_state.nodefs = false;
751 break;
752
753 case ARGP_conserve:
754 conserve_memory = 1;
755 break;
756
757 default:
758 return ARGP_ERR_UNKNOWN;
759 }
760 return 0;
761}
762
763
764/* Handle program arguments for real. */
765static error_t
766parse_opt_2nd (int key, char *arg,
767 struct argp_state *state __attribute__ ((unused)))
768{
769 static bool group_start_requested;
770 static bool group_end_requested;
771
772 switch (key)
773 {
774 case 'B':
775 parse_B_option_2 (arg);
776 break;
777
778 case 'e':
779 ld_state.entry = arg;
780 break;
781
782 case 'o':
783 if (ld_state.outfname != NULL)
784 {
785 error (0, 0, gettext ("More than one output file name given."));
786 see_help:
787 argp_help (&argp_2nd, stderr, ARGP_HELP_SEE, "ld");
788 exit (EXIT_FAILURE);
789 }
790 ld_state.outfname = arg;
791 break;
792
793 case 'O':
794 if (arg == NULL)
795 ld_state.optlevel = 1;
796 else
797 {
798 char *endp;
799 unsigned long int level = strtoul (arg, &endp, 10);
800 if (*endp != '\0')
801 {
802 error (0, 0, gettext ("Invalid optimization level `%s'"), arg);
803 goto see_help;
804 }
805 ld_state.optlevel = level;
806 }
807 break;
808
809 case ARGP_whole_archive:
810 ld_state.extract_rule = allextract;
811 break;
812 case ARGP_no_whole_archive:
813 ld_state.extract_rule = defaultextract;
814 break;
815
816 case ARGP_as_needed:
817 ld_state.as_needed = true;
818 break;
819 case ARGP_no_as_needed:
820 ld_state.as_needed = false;
821 break;
822
823 case ARGP_static:
824 case ARGP_dynamic:
825 /* Enable/disable use for DSOs. */
826 ld_state.statically = key == ARGP_static;
827 break;
828
829 case 'z':
830 /* The SysV linker used 'z' to pass various flags to the linker.
831 We follow this. See 'parse_z_option' for the options we
832 recognize. */
833 parse_z_option_2 (arg);
834 break;
835
836 case ARGP_version_script:
837 read_version_script (arg);
838 break;
839
840 case 'L':
841 /* Add a new search directory. */
842 ld_new_searchdir (arg);
843 break;
844
845 case '(':
846 /* Start a link group. We have to be able to determine the object
847 file which is named next. Do this by remembering a pointer to
848 the pointer which will point to the next object. */
849 if (verbose && (group_start_requested || !group_end_requested))
850 error (0, 0, gettext ("nested -( -) groups are not allowed"));
851
852 /* Increment the nesting level. */
853 ++group_level;
854
855 /* Record group start. */
856 group_start_requested = true;
857 group_end_requested = false;
858 break;
859
860 case ')':
861 /* End a link group. If there is no group open this is clearly
862 a bug. If there is a group open insert a back reference
863 pointer in the record for the last object of the group. If
864 there is no new object or just one don't do anything. */
865 if (!group_end_requested)
866 {
867 if (group_level == 0)
868 {
869 error (0, 0, gettext ("-) without matching -("));
870 goto see_help;
871 }
872 }
873 else
874 last_file->group_end = true;
875
876 if (group_level > 0)
877 --group_level;
878 break;
879
880 case 'l':
881 case ARGP_KEY_ARG:
882 {
883 while (last_file != NULL)
884 /* Try to open the file. */
885 error_loading |= FILE_PROCESS (-1, last_file, &ld_state, &last_file);
886
887 last_file = ld_new_inputfile (arg,
888 key == 'l'
889 ? archive_file_type
890 : relocatable_file_type);
891 if (group_start_requested)
892 {
893 last_file->group_start = true;
894
895 group_start_requested = false;
896 group_end_requested = true;
897 }
898 }
899 break;
900
901 default:
902 /* We can catch all other options here. They either have
903 already been handled or, if the parameter was not correct,
904 the error has been reported. */
905 break;
906 }
907 return 0;
908}
909
910
911/* Load all the DSOs named as dependencies in other DSOs we already
912 loaded. */
913static void
914load_needed (void)
915{
916 struct usedfiles *first;
917 struct usedfiles *runp;
918
919 /* XXX There is one problem here: do we allow references from
920 regular object files to be satisfied by these implicit
921 dependencies? The old linker allows this and several libraries
922 depend on this. Solaris' linker does not allow this; it provides
923 the user with a comprehensive error message explaining the
924 situation.
925
926 XXX IMO the old ld behavior is correct since this is also how the
927 dynamic linker will work. It will look for unresolved references
928 in all loaded DSOs.
929
930 XXX Should we add an option to get Solaris compatibility? */
931 if (ld_state.needed == NULL)
932 return;
933
934 runp = first = ld_state.needed->next;
935 do
936 {
937 struct usedfiles *ignore;
938 struct usedfiles *next = runp->next;
939 int err;
940
941 err = FILE_PROCESS (-1, runp, &ld_state, &ignore);
942 if (err != 0)
943 /* Something went wrong. */
944 exit (err);
945
946 runp = next;
947 }
948 while (runp != first);
949}
950
951
952/* Print the version information. */
953static void
954print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
955{
956 fprintf (stream, "ld (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
957 fprintf (stream, gettext ("\
958Copyright (C) %s Red Hat, Inc.\n\
959This is free software; see the source for copying conditions. There is NO\n\
960warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
961"), "2012");
962 fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
963}
964
965
966/* There are a lot of -z options, parse them here. Some of them have
967 to be parsed in the first pass, others must be handled in the
968 second pass. */
969static void
970parse_z_option (const char *arg)
971{
972 if (strcmp (arg, "nodefaultlib") == 0
973 /* This is only meaningful if we create a DSO. */
974 && ld_state.file_type == dso_file_type)
975 ld_state.dt_flags_1 |= DF_1_NODEFLIB;
976 else if (strcmp (arg, "muldefs") == 0)
977 ld_state.muldefs = true;
978 else if (strcmp (arg, "nodefs") == 0)
979 ld_state.nodefs = true;
980 else if (strcmp (arg, "defs") == 0)
981 ld_state.nodefs = false;
982 else if (strcmp (arg, "now") == 0)
983 /* We could also set the DF_1_NOW flag in DT_FLAGS_1 but this isn't
984 necessary. */
985 ld_state.dt_flags |= DF_BIND_NOW;
986 else if (strcmp (arg, "origin") == 0)
987 /* We could also set the DF_1_ORIGIN flag in DT_FLAGS_1 but this isn't
988 necessary. */
989 ld_state.dt_flags |= DF_ORIGIN;
990 else if (strcmp (arg, "nodelete") == 0
991 /* This is only meaningful if we create a DSO. */
992 && ld_state.file_type == dso_file_type)
993 ld_state.dt_flags_1 |= DF_1_NODELETE;
994 else if (strcmp (arg, "initfirst") == 0)
995 ld_state.dt_flags_1 |= DF_1_INITFIRST;
996 else if (strcmp (arg, "nodlopen") == 0
997 /* This is only meaningful if we create a DSO. */
998 && ld_state.file_type == dso_file_type)
999 ld_state.dt_flags_1 |= DF_1_NOOPEN;
1000 else if (strcmp (arg, "systemlibrary") == 0)
1001 ld_state.is_system_library = true;
1002 else if (strcmp (arg, "execstack") == 0)
1003 ld_state.execstack = execstack_true;
1004 else if (strcmp (arg, "noexecstack") == 0)
1005 ld_state.execstack = execstack_false_force;
1006 else if (strcmp (arg, "allextract") != 0
1007 && strcmp (arg, "defaultextract") != 0
1008 && strcmp (arg, "weakextract") != 0
1009 && strcmp (arg, "lazyload") != 0
1010 && strcmp (arg, "nolazyload") != 0
1011 && strcmp (arg, "ignore") != 0
1012 && strcmp (arg, "record") != 0)
1013 error (0, 0, gettext ("unknown option `-%c %s'"), 'z', arg);
1014}
1015
1016
1017static void
1018parse_z_option_2 (const char *arg)
1019{
1020 if (strcmp (arg, "allextract") == 0)
1021 ld_state.extract_rule = allextract;
1022 else if (strcmp (arg, "defaultextract") == 0)
1023 ld_state.extract_rule = defaultextract;
1024 else if (strcmp (arg, "weakextract") == 0)
1025 ld_state.extract_rule = weakextract;
1026 else if (strcmp (arg, "lazyload") == 0)
1027 ld_state.lazyload = true;
1028 else if (strcmp (arg, "nolazyload") == 0)
1029 ld_state.lazyload = false;
1030 else if (strcmp (arg, "ignore") == 0)
1031 ld_state.as_needed = true;
1032 else if (strcmp (arg, "record") == 0)
1033 ld_state.as_needed = false;
1034}
1035
1036
1037/* There are a lot of -B options, parse them here. */
1038static void
1039parse_B_option (const char *arg)
1040{
1041 if (strcmp (arg, "local") == 0)
1042 ld_state.default_bind_local = true;
1043 else if (strcmp (arg, "symbolic") != 0
1044 && strcmp (arg, "static") != 0
1045 && strcmp (arg, "dynamic") != 0)
1046 error (0, 0, gettext ("unknown option '-%c %s'"), 'B', arg);
1047}
1048
1049
1050/* The same functionality, but called in the second pass over the
1051 parameters. */
1052static void
1053parse_B_option_2 (const char *arg)
1054{
1055 if (strcmp (arg, "static") == 0)
1056 ld_state.statically = true;
1057 else if (strcmp (arg, "dynamic") == 0)
1058 ld_state.statically = false;
1059 else if (strcmp (arg, "symbolic") == 0
1060 /* This is only meaningful if we create a DSO. */
1061 && ld_state.file_type == dso_file_type)
1062 ld_state.dt_flags |= DF_SYMBOLIC;
1063}
1064
1065
1066static void
1067determine_output_format (void)
1068{
1069 /* First change the 'input_file_list' variable in a simple
1070 single-linked list. */
1071 struct file_list *last = input_file_list;
1072 input_file_list = input_file_list->next;
1073 last->next = NULL;
1074
1075 /* Determine the target configuration which we are supposed to use.
1076 The user can use the '-m' option to select one. If this is
1077 missing we are trying to load one file and determine the
1078 architecture from that. */
1079 if (emulation != NULL)
1080 {
1081 ld_state.ebl = ebl_openbackend_emulation (emulation);
1082
1083 assert (ld_state.ebl != NULL);
1084 }
1085 else
1086 {
1087 /* Find an ELF input file and let it determine the ELf backend. */
1088 struct file_list *runp = input_file_list;
1089
1090 while (runp != NULL)
1091 {
1092 int fd = open (runp->name, O_RDONLY);
1093 if (fd != -1)
1094 {
1095 int try (Elf *elf)
1096 {
1097 int result = 0;
1098
1099 if (elf == NULL)
1100 return 0;
1101
1102 if (elf_kind (elf) == ELF_K_ELF)
1103 {
1104 /* We have an ELF file. We now can find out
1105 what the output format should be. */
1106 XElf_Ehdr_vardef(ehdr);
1107
1108 /* Get the ELF header of the object. */
1109 xelf_getehdr (elf, ehdr);
1110 if (ehdr != NULL)
1111 ld_state.ebl =
1112 ebl_openbackend_machine (ehdr->e_machine);
1113
1114 result = 1;
1115 }
1116 else if (elf_kind (elf) == ELF_K_AR)
1117 {
1118 /* Try the archive members. This could
1119 potentially lead to wrong results if the
1120 archive contains files for more than one
1121 architecture. But this is the user's
1122 problem. */
1123 Elf *subelf;
1124 Elf_Cmd cmd = ELF_C_READ_MMAP;
1125
1126 while ((subelf = elf_begin (fd, cmd, elf)) != NULL)
1127 {
1128 cmd = elf_next (subelf);
1129
1130 if (try (subelf) != 0)
1131 break;
1132 }
1133 }
1134
1135 elf_end (elf);
1136
1137 return result;
1138 }
1139
1140 if (try (elf_begin (fd, ELF_C_READ_MMAP, NULL)) != 0)
1141 /* Found a file. */
1142 break;
1143 }
1144
1145 runp = runp->next;
1146 }
1147
1148 if (ld_state.ebl == NULL)
1149 {
1150 error (0, 0, gettext ("\
1151could not find input file to determine output file format"));
1152 error (EXIT_FAILURE, 0, gettext ("\
1153try again with an appropriate '-m' parameter"));
1154 }
1155 }
1156
1157 /* We don't need the list of input files anymore. The second run over
1158 the parameters will handle them. */
1159 while (input_file_list != NULL)
1160 {
1161 struct file_list *oldp = input_file_list;
1162 input_file_list = input_file_list->next;
1163 free (oldp);
1164 }
1165
1166 /* We also know now what kind of file we are supposed to create. If
1167 the user hasn't selected anythign we create and executable. */
1168 if (ld_state.file_type == no_file_type)
1169 ld_state.file_type = executable_file_type;
1170}
1171
1172/* Add DIR to the list of directories searched for object files and
1173 libraries. */
1174void
1175ld_new_searchdir (const char *dir)
1176{
1177 struct pathelement *newpath;
1178
1179 newpath = (struct pathelement *)
1180 obstack_calloc (&ld_state.smem, sizeof (struct pathelement));
1181
1182 newpath->pname = dir;
1183
1184 /* Enqueue the file. */
1185 if (ld_state.tailpaths == NULL)
1186 ld_state.paths = ld_state.tailpaths = newpath->next = newpath;
1187 else
1188 {
1189 ld_state.tailpaths->next = newpath;
1190 ld_state.tailpaths = newpath;
1191 newpath->next = ld_state.paths;
1192 }
1193}
1194
1195
1196struct usedfiles *
1197ld_new_inputfile (const char *fname, enum file_type type)
1198{
1199 struct usedfiles *newfile = (struct usedfiles *)
1200 obstack_calloc (&ld_state.smem, sizeof (struct usedfiles));
1201
1202 newfile->soname = newfile->fname = newfile->rfname = fname;
1203 newfile->file_type = type;
1204 newfile->extract_rule = ld_state.extract_rule;
1205 newfile->as_needed = ld_state.as_needed;
1206 newfile->lazyload = ld_state.lazyload;
1207 newfile->status = not_opened;
1208
1209 return newfile;
1210}
1211
1212
1213/* Create an array listing all the sections. We will than pass this
1214 array to a system specific function which can reorder it at will.
1215 The functions can also merge sections if this is what is
1216 wanted. */
1217static void
1218collect_sections (void)
1219{
1220 void *p ;
1221 struct scnhead *h;
1222 size_t cnt;
1223
1224 /* We have that many sections. At least for now. */
1225 ld_state.nallsections = ld_state.section_tab.filled;
1226
1227 /* Allocate the array. We allocate one more entry than computed so
1228 far since we might need a new section for the copy relocations. */
1229 ld_state.allsections =
1230 (struct scnhead **) obstack_alloc (&ld_state.smem,
1231 (ld_state.nallsections + 1)
1232 * sizeof (struct scnhead *));
1233
1234 /* Fill the array. We rely here on the hash table iterator to
1235 return the entries in the order they were added. */
1236 cnt = 0;
1237 p = NULL;
1238 while ((h = ld_section_tab_iterate (&ld_state.section_tab, &p)) != NULL)
1239 {
1240 struct scninfo *runp;
1241 bool used = false;
1242
1243 if (h->kind == scn_normal)
1244 {
1245 runp = h->last;
1246 do
1247 {
1248 if (h->type == SHT_REL || h->type == SHT_RELA)
1249 {
1250 if (runp->used)
1251 /* This is a relocation section. If the section
1252 it is relocating is used in the result so must
1253 the relocation section. */
1254 runp->used
1255 = runp->fileinfo->scninfo[SCNINFO_SHDR (runp->shdr).sh_info].used;
1256 }
1257
1258 /* Accumulate the result. */
1259 used |= runp->used;
1260
1261 /* Next input section. */
1262 runp = runp->next;
1263 }
1264 while (runp != h->last);
1265
1266 h->used = used;
1267 }
1268
1269 ld_state.allsections[cnt++] = h;
1270 }
1271 ld_state.nusedsections = cnt;
1272
1273 assert (cnt == ld_state.nallsections);
1274}
1275
1276
1277/* Add given path to the end of list. */
1278static void
1279add_rxxpath (struct pathelement **pathp, const char *str)
1280{
1281 struct pathelement *newp;
1282
1283 /* The path elements can in theory be freed after we read all the
1284 files. But the amount of memory we are talking about is small
1285 and the cost of free() calls is not neglectable. */
1286 newp = (struct pathelement *) obstack_alloc (&ld_state.smem, sizeof (*newp));
1287 newp->pname = str;
1288 newp->exist = 0;
1289#ifndef NDEBUG
1290 newp->next = NULL;
1291#endif
1292
1293 CSNGL_LIST_ADD_REAR (*pathp, newp);
1294}
1295
1296
1297/* Convert lists of possibly colon-separated directory lists into lists
1298 where each entry is for a single directory. */
1299static void
1300normalize_dirlist (struct pathelement **pathp)
1301{
1302 struct pathelement *firstp = *pathp;
1303
1304 do
1305 {
1306 const char *pname = (*pathp)->pname;
1307 const char *colonp = strchrnul (pname, ':');
1308
1309 if (colonp != NULL)
1310 {
1311 struct pathelement *lastp = *pathp;
1312 struct pathelement *newp;
1313
1314 while (1)
1315 {
1316 if (colonp == pname)
1317 lastp->pname = ".";
1318 else
1319 lastp->pname = obstack_strndup (&ld_state.smem, pname,
1320 colonp - pname);
1321
1322 if (*colonp == '\0')
1323 break;
1324 pname = colonp + 1;
1325
1326 newp = (struct pathelement *) obstack_alloc (&ld_state.smem,
1327 sizeof (*newp));
1328 newp->next = lastp->next;
1329 newp->exist = 0;
1330 lastp = lastp->next = newp;
1331
1332 colonp = strchrnul (pname, ':');
1333 }
1334
1335 pathp = &lastp->next;
1336 }
1337 else
1338 pathp = &(*pathp)->next;
1339 }
1340 while (*pathp != firstp);
1341}
1342
1343
1344/* Called after all parameters are parsed to bring the runpath/rpath
1345 information into a usable form. */
1346static void
1347gen_rxxpath_data (void)
1348{
1349 char *ld_library_path2;
1350
1351 /* Convert the information in true single-linked lists for easy use.
1352 At this point we also discard the rpath information if runpath
1353 information is provided. rpath is deprecated and should not be
1354 used (or ever be invented for that matter). */
1355 if (ld_state.rpath != NULL)
1356 {
1357 struct pathelement *endp = ld_state.rpath;
1358 ld_state.rpath = ld_state.rpath->next;
1359 endp->next = NULL;
1360 }
1361 if (ld_state.rpath_link != NULL)
1362 {
1363 struct pathelement *endp = ld_state.rpath_link;
1364 ld_state.rpath_link = ld_state.rpath_link->next;
1365 endp->next = NULL;
1366 }
1367
1368 if (ld_state.runpath != NULL)
1369 {
1370 struct pathelement *endp = ld_state.runpath;
1371 ld_state.runpath = ld_state.runpath->next;
1372 endp->next = NULL;
1373
1374 /* If rpath information is also available discard it.
1375 XXX Should there be a possibility to avoid this? */
1376 while (ld_state.rpath != NULL)
1377 {
1378 struct pathelement *old = ld_state.rpath;
1379 ld_state.rpath = ld_state.rpath->next;
1380 free (old);
1381 }
1382 }
1383 if (ld_state.runpath_link != NULL)
1384 {
1385 struct pathelement *endp = ld_state.runpath_link;
1386 ld_state.runpath_link = ld_state.runpath_link->next;
1387 endp->next = NULL;
1388
1389 /* If rpath information is also available discard it.
1390 XXX Should there be a possibility to avoid this? */
1391 while (ld_state.rpath_link != NULL)
1392 {
1393 struct pathelement *old = ld_state.rpath_link;
1394 ld_state.rpath_link = ld_state.rpath_link->next;
1395 free (old);
1396 }
1397
1398 /* The information in the strings in the list can actually be
1399 directory lists themselves, with entries separated by colons.
1400 Convert the list now to a list with one list entry for each
1401 directory. */
1402 normalize_dirlist (&ld_state.runpath_link);
1403 }
1404 else if (ld_state.rpath_link != NULL)
1405 /* Same as for the runpath_link above. */
1406 normalize_dirlist (&ld_state.rpath_link);
1407
1408
1409 /* As a related task, handle the LD_LIBRARY_PATH value here. First
1410 we have to possibly split the value found (if it contains a
1411 semicolon). Then we have to split the value in list of
1412 directories, i.e., split at the colons. */
1413 if (ld_library_path1 != NULL)
1414 {
1415 ld_library_path2 = strchr (ld_library_path1, ';');
1416 if (ld_library_path2 == NULL)
1417 {
1418 /* If no semicolon is present the directories are looked at
1419 after the -L parameters (-> ld_library_path2). */
1420 ld_library_path2 = ld_library_path1;
1421 ld_library_path1 = NULL;
1422 }
1423 else
1424 {
1425 /* NUL terminate the first part. */
1426 *ld_library_path2++ = '\0';
1427
1428 /* Convert the string value in a list. */
1429 add_rxxpath (&ld_state.ld_library_path1, ld_library_path1);
1430 normalize_dirlist (&ld_state.ld_library_path1);
1431 }
1432
1433 add_rxxpath (&ld_state.ld_library_path2, ld_library_path2);
1434 normalize_dirlist (&ld_state.ld_library_path2);
1435 }
1436}
1437
1438
1439static void
1440read_version_script (const char *fname)
1441{
1442 /* Open the file. The name is supposed to be the complete (relative
1443 or absolute) path. No search along a path will be performed. */
1444 ldin = fopen (fname, "r");
1445 if (ldin == NULL)
1446 error (EXIT_FAILURE, errno, gettext ("cannot read version script '%s'"),
1447 fname);
1448 /* No need for locking. */
1449 __fsetlocking (ldin, FSETLOCKING_BYCALLER);
1450
1451 /* Tell the parser that this is a version script. */
1452 ld_scan_version_script = 1;
1453
1454 ldlineno = 1;
1455 ldin_fname = fname;
1456 if (ldparse () != 0)
1457 /* Something went wrong during parsing. */
1458 exit (EXIT_FAILURE);
1459
1460 fclose (ldin);
1461}
1462
1463
1464static void
1465create_lscript_symbols (void)
1466{
1467 /* Walk through the data from the linker script and generate all the
1468 symbols which are required to be present and those marked
1469 with PROVIDE if there is a undefined reference. */
1470 if (ld_state.output_segments == NULL)
1471 return;
1472
1473 struct output_segment *segment = ld_state.output_segments->next;
1474 do
1475 {
1476 struct output_rule *orule;
1477
1478 for (orule = segment->output_rules; orule != NULL; orule = orule->next)
1479 if (orule->tag == output_assignment
1480 /* The assignments to "." (i.e., the PC) have to be
1481 ignored here. */
1482 && strcmp (orule->val.assignment->variable, ".") != 0)
1483 {
1484 struct symbol *s = ld_state.unresolved;
1485
1486 /* Check whether the symbol is needed. */
1487 if (likely (s != NULL))
1488 {
1489 struct symbol *first = s;
1490 const char *providename = orule->val.assignment->variable;
1491
1492 /* Determine whether the provided symbol is still
1493 undefined. */
1494 // XXX TODO Loop inside a loop. Gag! Must rewrite. */
1495 do
1496 if (strcmp (s->name, providename) == 0)
1497 {
1498 /* Not defined but referenced. */
1499 if (unlikely (!s->defined))
1500 {
1501 /* Put on the list of symbols. First remove it from
1502 whatever list it currently is on. */
1503 CDBL_LIST_DEL (ld_state.unresolved, s);
1504 --ld_state.nunresolved;
1505 goto use_it;
1506 }
1507
1508 if (unlikely (!orule->val.assignment->provide_flag))
1509 {
1510 /* The symbol is already defined and now again
1511 in the linker script. This is an error. */
1512 error (0, 0, gettext ("\
1513duplicate definition of '%s' in linker script"),
1514 providename);
1515 goto next_rule;
1516 }
1517 }
1518 while ((s = s->next) != first);
1519 }
1520
1521 /* If the symbol only has to be provided if it is needed,
1522 ignore it here since it is not undefined. */
1523 if (orule->val.assignment->provide_flag)
1524 continue;
1525
1526 /* Allocate memory for this new symbol. */
1527 s = (struct symbol *)
1528 obstack_calloc (&ld_state.smem, sizeof (struct symbol));
1529
1530 /* Initialize it. */
1531 s->name = orule->val.assignment->variable;
1532
1533 /* Insert it into the symbol hash table. */
1534 unsigned long int hval = elf_hash (s->name);
1535 if (unlikely (ld_symbol_tab_insert (&ld_state.symbol_tab,
1536 hval, s) != 0))
1537 {
1538 /* This means the symbol is defined somewhere else.
1539 Maybe it comes from a DSO or so. Get the
1540 definition. */
1541 free (s);
1542 struct symbol *old = ld_symbol_tab_find (&ld_state.symbol_tab,
1543 hval, s);
1544 assert (old != NULL);
1545 free (s);
1546
1547 /* If this is a definition from the application itself
1548 this means a duplicate definition. */
1549 if (! old->in_dso)
1550 {
1551 error (0, 0, gettext ("\
1552duplicate definition of '%s' in linker script"),
1553 s->name);
1554 goto next_rule;
1555 }
1556
1557 /* We use the definition from the linker script. */
1558 s = old;
1559 }
1560
1561 use_it:
1562 /* The symbol is (now) defined. */
1563 s->defined = 1;
1564 s->type = STT_NOTYPE;
1565
1566 /* Add a reference to the symbol record. We will come
1567 across it when creating the output file. */
1568 orule->val.assignment->sym = s;
1569
1570 SNGL_LIST_PUSH (ld_state.lscript_syms, s);
1571 ++ld_state.nlscript_syms;
1572
1573 next_rule:
1574 ;
1575 }
1576
1577 segment = segment->next;
1578 }
1579 while (segment != ld_state.output_segments->next);
1580}
1581
1582
1583/* Create creation of spection section symbols representing sections in the
1584 output file. This is done for symbols like _GLOBAL_OFFSET_TABLE_ and
1585 _DYNAMIC. */
1586static void
1587create_special_section_symbol (struct symbol **symp, const char *name)
1588{
1589 if (*symp == NULL)
1590 {
1591 /* No symbol defined found yet. Create one. */
1592 struct symbol *newsym = (struct symbol *)
1593 obstack_calloc (&ld_state.smem, sizeof (*newsym));
1594
1595 newsym->name = name;
1596 // XXX Should we mark the symbol hidden? They are hardly useful
1597 // used outside the current object.
1598
1599 /* Add to the symbol table. */
1600 if (unlikely (ld_symbol_tab_insert (&ld_state.symbol_tab,
1601 elf_hash (name), newsym) != 0))
1602 abort ();
1603
1604 *symp = newsym;
1605 }
1606 else if ((*symp)->defined)
1607 /* Cannot happen. We do use this symbol from any input file. */
1608 abort ();
1609
1610 (*symp)->defined = 1;
1611 (*symp)->local = 1;
1612 (*symp)->hidden = 1;
1613 (*symp)->type = STT_OBJECT;
1614
1615 ++ld_state.nsymtab;
1616}
1617
1618
1619#include "debugpred.h"