diff options
Diffstat (limited to 'ld/ldmain.c')
-rw-r--r-- | ld/ldmain.c | 288 |
1 files changed, 127 insertions, 161 deletions
diff --git a/ld/ldmain.c b/ld/ldmain.c index 424a400..3647217 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -51,7 +51,7 @@ #ifdef HAVE_SBRK #ifdef NEED_DECLARATION_SBRK -extern PTR sbrk (); +extern void *sbrk (); #endif #endif @@ -59,8 +59,6 @@ extern PTR sbrk (); #define TARGET_SYSTEM_ROOT "" #endif -int main PARAMS ((int, char **)); - /* EXPORTS */ char *default_target; @@ -103,45 +101,40 @@ args_type command_line; ld_config_type config; static char *get_emulation - PARAMS ((int, char **)); + (int, char **); static void set_scripts_dir - PARAMS ((void)); -static void remove_output - PARAMS ((void)); -static bfd_boolean check_for_scripts_dir - PARAMS ((char *)); + (void); static bfd_boolean add_archive_element - PARAMS ((struct bfd_link_info *, bfd *, const char *)); + (struct bfd_link_info *, bfd *, const char *); static bfd_boolean multiple_definition - PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma, - bfd *, asection *, bfd_vma)); + (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma, + bfd *, asection *, bfd_vma); static bfd_boolean multiple_common - PARAMS ((struct bfd_link_info *, const char *, bfd *, - enum bfd_link_hash_type, bfd_vma, bfd *, enum bfd_link_hash_type, - bfd_vma)); + (struct bfd_link_info *, const char *, bfd *, enum bfd_link_hash_type, + bfd_vma, bfd *, enum bfd_link_hash_type, bfd_vma); static bfd_boolean add_to_set - PARAMS ((struct bfd_link_info *, struct bfd_link_hash_entry *, - bfd_reloc_code_real_type, bfd *, asection *, bfd_vma)); + (struct bfd_link_info *, struct bfd_link_hash_entry *, + bfd_reloc_code_real_type, bfd *, asection *, bfd_vma); static bfd_boolean constructor_callback - PARAMS ((struct bfd_link_info *, bfd_boolean, const char *, bfd *, - asection *, bfd_vma)); + (struct bfd_link_info *, bfd_boolean, const char *, bfd *, + asection *, bfd_vma); static bfd_boolean warning_callback - PARAMS ((struct bfd_link_info *, const char *, const char *, bfd *, - asection *, bfd_vma)); + (struct bfd_link_info *, const char *, const char *, bfd *, + asection *, bfd_vma); static void warning_find_reloc - PARAMS ((bfd *, asection *, PTR)); + (bfd *, asection *, void *); static bfd_boolean undefined_symbol - PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma, - bfd_boolean)); + (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma, + bfd_boolean); static bfd_boolean reloc_overflow - PARAMS ((struct bfd_link_info *, const char *, const char *, bfd_vma, - bfd *, asection *, bfd_vma)); + (struct bfd_link_info *, const char *, const char *, bfd_vma, + bfd *, asection *, bfd_vma); static bfd_boolean reloc_dangerous - PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma)); + (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma); static bfd_boolean unattached_reloc - PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma)); + (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma); static bfd_boolean notice - PARAMS ((struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma)); + (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma); static struct bfd_link_callbacks link_callbacks = { @@ -162,7 +155,7 @@ static struct bfd_link_callbacks link_callbacks = struct bfd_link_info link_info; static void -remove_output () +remove_output (void) { if (output_filename) { @@ -174,9 +167,7 @@ remove_output () } int -main (argc, argv) - int argc; - char **argv; +main (int argc, char **argv) { char *emulation; long start_time = get_run_time (); @@ -329,8 +320,8 @@ main (argc, argv) link_info.pei386_auto_import = -1; link_info.pei386_runtime_pseudo_reloc = FALSE; link_info.spare_dynamic_tags = 5; - link_info.flags = (bfd_vma) 0; - link_info.flags_1 = (bfd_vma) 0; + link_info.flags = 0; + link_info.flags_1 = 0; link_info.relax_finalizing = FALSE; ldfile_add_arch (""); @@ -530,9 +521,11 @@ main (argc, argv) dst = fopen (dst_name, FOPEN_WB); if (!src) - einfo (_("%X%P: unable to open for source of copy `%s'\n"), output_filename); + einfo (_("%X%P: unable to open for source of copy `%s'\n"), + output_filename); if (!dst) - einfo (_("%X%P: unable to open for destination of copy `%s'\n"), dst_name); + einfo (_("%X%P: unable to open for destination of copy `%s'\n"), + dst_name); while ((l = fread (buf, 1, bsize, src)) > 0) { int done = fwrite (buf, 1, l, dst); @@ -555,7 +548,7 @@ main (argc, argv) if (config.stats) { #ifdef HAVE_SBRK - char *lim = (char *) sbrk (0); + char *lim = sbrk (0); #endif long run_time = get_run_time () - start_time; @@ -578,9 +571,7 @@ main (argc, argv) state that's needed by the lex&yacc argument parser (parse_args). */ static char * -get_emulation (argc, argv) - int argc; - char **argv; +get_emulation (int argc, char **argv) { char *emulation; int i; @@ -643,8 +634,7 @@ get_emulation (argc, argv) else return FALSE. */ static bfd_boolean -check_for_scripts_dir (dir) - char *dir; +check_for_scripts_dir (char *dir) { size_t dirlen; char *buf; @@ -653,7 +643,7 @@ check_for_scripts_dir (dir) dirlen = strlen (dir); /* sizeof counts the terminating NUL. */ - buf = (char *) xmalloc (dirlen + sizeof ("/ldscripts")); + buf = xmalloc (dirlen + sizeof ("/ldscripts")); sprintf (buf, "%s/ldscripts", dir); res = stat (buf, &s) == 0 && S_ISDIR (s.st_mode); @@ -675,7 +665,7 @@ check_for_scripts_dir (dir) (for installing the tool suite elsewhere). */ static void -set_scripts_dir () +set_scripts_dir (void) { char *end, *dir; size_t dirlen; @@ -723,7 +713,7 @@ set_scripts_dir () dirlen = end - program_name; /* Make a copy of program_name in dir. Leave room for later "/../lib". */ - dir = (char *) xmalloc (dirlen + 8); + dir = xmalloc (dirlen + 8); strncpy (dir, program_name, dirlen); dir[dirlen] = '\0'; @@ -740,34 +730,29 @@ set_scripts_dir () } void -add_ysym (name) - const char *name; +add_ysym (const char *name) { - if (link_info.notice_hash == (struct bfd_hash_table *) NULL) + if (link_info.notice_hash == NULL) { - link_info.notice_hash = ((struct bfd_hash_table *) - xmalloc (sizeof (struct bfd_hash_table))); + link_info.notice_hash = xmalloc (sizeof (struct bfd_hash_table)); if (! bfd_hash_table_init_n (link_info.notice_hash, bfd_hash_newfunc, 61)) einfo (_("%P%F: bfd_hash_table_init failed: %E\n")); } - if (bfd_hash_lookup (link_info.notice_hash, name, TRUE, TRUE) - == (struct bfd_hash_entry *) NULL) + if (bfd_hash_lookup (link_info.notice_hash, name, TRUE, TRUE) == NULL) einfo (_("%P%F: bfd_hash_lookup failed: %E\n")); } /* Record a symbol to be wrapped, from the --wrap option. */ void -add_wrap (name) - const char *name; +add_wrap (const char *name) { if (link_info.wrap_hash == NULL) { - link_info.wrap_hash = ((struct bfd_hash_table *) - xmalloc (sizeof (struct bfd_hash_table))); + link_info.wrap_hash = xmalloc (sizeof (struct bfd_hash_table)); if (! bfd_hash_table_init_n (link_info.wrap_hash, bfd_hash_newfunc, 61)) @@ -781,8 +766,7 @@ add_wrap (name) /* Handle the -retain-symbols-file option. */ void -add_keepsyms_file (filename) - const char *filename; +add_keepsyms_file (const char *filename) { FILE *file; char *buf; @@ -793,20 +777,19 @@ add_keepsyms_file (filename) einfo (_("%X%P: error: duplicate retain-symbols-file\n")); file = fopen (filename, "r"); - if (file == (FILE *) NULL) + if (file == NULL) { bfd_set_error (bfd_error_system_call); einfo ("%X%P: %s: %E\n", filename); return; } - link_info.keep_hash = ((struct bfd_hash_table *) - xmalloc (sizeof (struct bfd_hash_table))); + link_info.keep_hash = xmalloc (sizeof (struct bfd_hash_table)); if (! bfd_hash_table_init (link_info.keep_hash, bfd_hash_newfunc)) einfo (_("%P%F: bfd_hash_table_init failed: %E\n")); bufsize = 100; - buf = (char *) xmalloc (bufsize); + buf = xmalloc (bufsize); c = getc (file); while (c != EOF) @@ -832,8 +815,7 @@ add_keepsyms_file (filename) buf[len] = '\0'; - if (bfd_hash_lookup (link_info.keep_hash, buf, TRUE, TRUE) - == (struct bfd_hash_entry *) NULL) + if (bfd_hash_lookup (link_info.keep_hash, buf, TRUE, TRUE) == NULL) einfo (_("%P%F: bfd_hash_lookup for insertion failed: %E\n")); } } @@ -851,15 +833,13 @@ add_keepsyms_file (filename) a link. */ static bfd_boolean -add_archive_element (info, abfd, name) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - bfd *abfd; - const char *name; +add_archive_element (struct bfd_link_info *info ATTRIBUTE_UNUSED, + bfd *abfd, + const char *name) { lang_input_statement_type *input; - input = ((lang_input_statement_type *) - xmalloc (sizeof (lang_input_statement_type))); + input = xmalloc (sizeof (lang_input_statement_type)); input->filename = abfd->filename; input->local_sym_name = abfd->filename; input->the_bfd = abfd; @@ -877,7 +857,7 @@ add_archive_element (info, abfd, name) ldlang_add_file (input); - if (config.map_file != (FILE *) NULL) + if (config.map_file != NULL) { static bfd_boolean header_printed; struct bfd_link_hash_entry *h; @@ -964,15 +944,14 @@ add_archive_element (info, abfd, name) multiple times. */ static bfd_boolean -multiple_definition (info, name, obfd, osec, oval, nbfd, nsec, nval) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - const char *name; - bfd *obfd; - asection *osec; - bfd_vma oval; - bfd *nbfd; - asection *nsec; - bfd_vma nval; +multiple_definition (struct bfd_link_info *info ATTRIBUTE_UNUSED, + const char *name, + bfd *obfd, + asection *osec, + bfd_vma oval, + bfd *nbfd, + asection *nsec, + bfd_vma nval) { /* If either section has the output_section field set to bfd_abs_section_ptr, it means that the section is being @@ -989,7 +968,7 @@ multiple_definition (info, name, obfd, osec, oval, nbfd, nsec, nval) einfo (_("%X%C: multiple definition of `%T'\n"), nbfd, nsec, nval, name); - if (obfd != (bfd *) NULL) + if (obfd != NULL) einfo (_("%D: first defined here\n"), obfd, osec, oval); if (command_line.relax) @@ -1007,15 +986,14 @@ multiple_definition (info, name, obfd, osec, oval, nbfd, nsec, nval) -warn-common was used. */ static bfd_boolean -multiple_common (info, name, obfd, otype, osize, nbfd, ntype, nsize) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - const char *name; - bfd *obfd; - enum bfd_link_hash_type otype; - bfd_vma osize; - bfd *nbfd; - enum bfd_link_hash_type ntype; - bfd_vma nsize; +multiple_common (struct bfd_link_info *info ATTRIBUTE_UNUSED, + const char *name, + bfd *obfd, + enum bfd_link_hash_type otype, + bfd_vma osize, + bfd *nbfd, + enum bfd_link_hash_type ntype, + bfd_vma nsize) { if (! config.warn_common) return TRUE; @@ -1073,13 +1051,12 @@ multiple_common (info, name, obfd, otype, osize, nbfd, ntype, nsize) represent a value which should be added to the set. */ static bfd_boolean -add_to_set (info, h, reloc, abfd, section, value) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - struct bfd_link_hash_entry *h; - bfd_reloc_code_real_type reloc; - bfd *abfd; - asection *section; - bfd_vma value; +add_to_set (struct bfd_link_info *info ATTRIBUTE_UNUSED, + struct bfd_link_hash_entry *h, + bfd_reloc_code_real_type reloc, + bfd *abfd, + asection *section, + bfd_vma value) { if (config.warn_constructors) einfo (_("%P: warning: global constructor %s used\n"), @@ -1088,7 +1065,7 @@ add_to_set (info, h, reloc, abfd, section, value) if (! config.build_constructors) return TRUE; - ldctor_add_set_entry (h, reloc, (const char *) NULL, section, value); + ldctor_add_set_entry (h, reloc, NULL, section, value); if (h->type == bfd_link_hash_new) { @@ -1108,13 +1085,12 @@ add_to_set (info, h, reloc, abfd, section, value) adding an element to a set, but less general. */ static bfd_boolean -constructor_callback (info, constructor, name, abfd, section, value) - struct bfd_link_info *info; - bfd_boolean constructor; - const char *name; - bfd *abfd; - asection *section; - bfd_vma value; +constructor_callback (struct bfd_link_info *info, + bfd_boolean constructor, + const char *name, + bfd *abfd, + asection *section, + bfd_vma value) { char *s; struct bfd_link_hash_entry *h; @@ -1171,13 +1147,12 @@ struct warning_callback_info /* This is called when there is a reference to a warning symbol. */ static bfd_boolean -warning_callback (info, warning, symbol, abfd, section, address) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - const char *warning; - const char *symbol; - bfd *abfd; - asection *section; - bfd_vma address; +warning_callback (struct bfd_link_info *info ATTRIBUTE_UNUSED, + const char *warning, + const char *symbol, + bfd *abfd, + asection *section, + bfd_vma address) { /* This is a hack to support warn_multiple_gp. FIXME: This should have a cleaner interface, but what? */ @@ -1210,7 +1185,7 @@ warning_callback (info, warning, symbol, abfd, section, address) symsize = bfd_get_symtab_upper_bound (abfd); if (symsize < 0) einfo (_("%B%F: could not read symbols: %E\n"), abfd); - asymbols = (asymbol **) xmalloc (symsize); + asymbols = xmalloc (symsize); symbol_count = bfd_canonicalize_symtab (abfd, asymbols); if (symbol_count < 0) einfo (_("%B%F: could not read symbols: %E\n"), abfd); @@ -1225,7 +1200,7 @@ warning_callback (info, warning, symbol, abfd, section, address) info.warning = warning; info.symbol = symbol; info.asymbols = asymbols; - bfd_map_over_sections (abfd, warning_find_reloc, (PTR) &info); + bfd_map_over_sections (abfd, warning_find_reloc, &info); if (! info.found) einfo ("%B: %s\n", abfd, warning); @@ -1243,12 +1218,9 @@ warning_callback (info, warning, symbol, abfd, section, address) to give an error message with a file and line number. */ static void -warning_find_reloc (abfd, sec, iarg) - bfd *abfd; - asection *sec; - PTR iarg; +warning_find_reloc (bfd *abfd, asection *sec, void *iarg) { - struct warning_callback_info *info = (struct warning_callback_info *) iarg; + struct warning_callback_info *info = iarg; long relsize; arelent **relpp; long relcount; @@ -1263,7 +1235,7 @@ warning_find_reloc (abfd, sec, iarg) if (relsize == 0) return; - relpp = (arelent **) xmalloc (relsize); + relpp = xmalloc (relsize); relcount = bfd_canonicalize_reloc (abfd, sec, relpp, info->asymbols); if (relcount < 0) einfo (_("%B%F: could not read relocs: %E\n"), abfd); @@ -1291,13 +1263,12 @@ warning_find_reloc (abfd, sec, iarg) /* This is called when an undefined symbol is found. */ static bfd_boolean -undefined_symbol (info, name, abfd, section, address, fatal) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - const char *name; - bfd *abfd; - asection *section; - bfd_vma address; - bfd_boolean fatal ATTRIBUTE_UNUSED; +undefined_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED, + const char *name, + bfd *abfd, + asection *section, + bfd_vma address, + bfd_boolean fatal ATTRIBUTE_UNUSED) { static char *error_name; static unsigned int error_count; @@ -1311,8 +1282,7 @@ undefined_symbol (info, name, abfd, section, address, fatal) /* Only warn once about a particular undefined symbol. */ if (hash == NULL) { - hash = ((struct bfd_hash_table *) - xmalloc (sizeof (struct bfd_hash_table))); + hash = xmalloc (sizeof (struct bfd_hash_table)); if (! bfd_hash_table_init (hash, bfd_hash_newfunc)) einfo (_("%F%P: bfd_hash_table_init failed: %E\n")); } @@ -1326,13 +1296,13 @@ undefined_symbol (info, name, abfd, section, address, fatal) /* We never print more than a reasonable number of errors in a row for a single symbol. */ - if (error_name != (char *) NULL + if (error_name != NULL && strcmp (name, error_name) == 0) ++error_count; else { error_count = 0; - if (error_name != (char *) NULL) + if (error_name != NULL) free (error_name); error_name = xstrdup (name); } @@ -1379,19 +1349,18 @@ int overflow_cutoff_limit = 10; /* This is called when a reloc overflows. */ static bfd_boolean -reloc_overflow (info, name, reloc_name, addend, abfd, section, address) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - const char *name; - const char *reloc_name; - bfd_vma addend; - bfd *abfd; - asection *section; - bfd_vma address; +reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED, + const char *name, + const char *reloc_name, + bfd_vma addend, + bfd *abfd, + asection *section, + bfd_vma address) { if (overflow_cutoff_limit == -1) return TRUE; - if (abfd == (bfd *) NULL) + if (abfd == NULL) einfo (_("%P%X: generated")); else einfo ("%X%C:", abfd, section, address); @@ -1413,14 +1382,13 @@ reloc_overflow (info, name, reloc_name, addend, abfd, section, address) /* This is called when a dangerous relocation is made. */ static bfd_boolean -reloc_dangerous (info, message, abfd, section, address) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - const char *message; - bfd *abfd; - asection *section; - bfd_vma address; +reloc_dangerous (struct bfd_link_info *info ATTRIBUTE_UNUSED, + const char *message, + bfd *abfd, + asection *section, + bfd_vma address) { - if (abfd == (bfd *) NULL) + if (abfd == NULL) einfo (_("%P%X: generated")); else einfo ("%X%C:", abfd, section, address); @@ -1432,14 +1400,13 @@ reloc_dangerous (info, message, abfd, section, address) that is not being output. */ static bfd_boolean -unattached_reloc (info, name, abfd, section, address) - struct bfd_link_info *info ATTRIBUTE_UNUSED; - const char *name; - bfd *abfd; - asection *section; - bfd_vma address; +unattached_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED, + const char *name, + bfd *abfd, + asection *section, + bfd_vma address) { - if (abfd == (bfd *) NULL) + if (abfd == NULL) einfo (_("%P%X: generated")); else einfo ("%X%C:", abfd, section, address); @@ -1452,12 +1419,11 @@ unattached_reloc (info, name, abfd, section, address) using the -y option. */ static bfd_boolean -notice (info, name, abfd, section, value) - struct bfd_link_info *info; - const char *name; - bfd *abfd; - asection *section; - bfd_vma value; +notice (struct bfd_link_info *info, + const char *name, + bfd *abfd, + asection *section, + bfd_vma value) { if (! info->notice_all || (info->notice_hash != NULL |