diff options
author | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1996-06-10 10:55:58 +0000 |
---|---|---|
committer | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1996-06-10 10:55:58 +0000 |
commit | a7e831079363e3bb45f3172f6e59ba48e335682b (patch) | |
tree | ee4324eac9a9d66f189fab60498ec42b8226b7fc /gnu/usr.bin/binutils/ld/ldwrite.c | |
parent | 467cb0a471d13c5186a6ee166e60b47c30da64e9 (diff) |
Bring Cygnus versions into the trunk, keeping our local patches
Diffstat (limited to 'gnu/usr.bin/binutils/ld/ldwrite.c')
-rw-r--r-- | gnu/usr.bin/binutils/ld/ldwrite.c | 207 |
1 files changed, 54 insertions, 153 deletions
diff --git a/gnu/usr.bin/binutils/ld/ldwrite.c b/gnu/usr.bin/binutils/ld/ldwrite.c index 0bb86691644..7c8e81cbc2e 100644 --- a/gnu/usr.bin/binutils/ld/ldwrite.c +++ b/gnu/usr.bin/binutils/ld/ldwrite.c @@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "bfd.h" #include "sysdep.h" #include "bfdlink.h" +#include "libiberty.h" #include "ld.h" #include "ldexp.h" @@ -31,11 +32,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "ldmain.h" static void build_link_order PARAMS ((lang_statement_union_type *)); -static void print_symbol_table PARAMS ((void)); -static void print_file_stuff PARAMS ((lang_input_statement_type *)); -static boolean print_symbol PARAMS ((struct bfd_link_hash_entry *, PTR)); - -extern char *strdup(); /* Build link_order structures for the BFD linker. */ @@ -64,6 +60,58 @@ build_link_order (statement) value = statement->data_statement.value; + /* If the endianness of the output BFD is not known, then we + base the endianness of the data on the first input file. + By convention, the bfd_put routines for an unknown + endianness are big endian, so we must swap here if the + input file is little endian. */ + if (! bfd_big_endian (output_bfd) + && ! bfd_little_endian (output_bfd)) + { + boolean swap; + + swap = false; + if (command_line.endian == ENDIAN_LITTLE) + swap = true; + else if (command_line.endian == ENDIAN_UNSET) + { + LANG_FOR_EACH_INPUT_STATEMENT (s) + { + if (s->the_bfd != NULL) + { + if (bfd_little_endian (s->the_bfd)) + swap = true; + break; + } + } + } + + if (swap) + { + bfd_byte buffer[8]; + + switch (statement->data_statement.type) + { + case QUAD: + bfd_putl64 (value, buffer); + value = bfd_getb64 (buffer); + break; + case LONG: + bfd_putl32 (value, buffer); + value = bfd_getb32 (buffer); + break; + case SHORT: + bfd_putl16 (value, buffer); + value = bfd_getb16 (buffer); + break; + case BYTE: + break; + default: + abort (); + } + } + } + ASSERT (output_section->owner == output_bfd); switch (statement->data_statement.type) { @@ -232,7 +280,7 @@ clone_section (abfd, s, count) } while (bfd_get_section_by_name (abfd, sname)); - n = bfd_make_section_anyway (abfd, strdup (sname)); + n = bfd_make_section_anyway (abfd, xstrdup (sname)); /* Create a symbol of the same name */ @@ -438,151 +486,4 @@ ldwrite () else xexit(1); } - - if (config.map_file) - { - print_symbol_table (); - lang_map (); - } -} - -/* Print the symbol table. */ - -static void -print_symbol_table () -{ - fprintf (config.map_file, "**FILES**\n\n"); - lang_for_each_file (print_file_stuff); - - fprintf (config.map_file, "**GLOBAL SYMBOLS**\n\n"); - fprintf (config.map_file, "offset section offset symbol\n"); - bfd_link_hash_traverse (link_info.hash, print_symbol, (PTR) NULL); -} - -/* Print information about a file. */ - -static void -print_file_stuff (f) - lang_input_statement_type *f; -{ - fprintf (config.map_file, " %s\n", f->filename); - if (f->just_syms_flag) - { - fprintf (config.map_file, " symbols only\n"); - } - else - { - asection *s; - if (true) - { - for (s = f->the_bfd->sections; - s != (asection *) NULL; - s = s->next) - { -#ifdef WINDOWS_NT - /* Don't include any information that goes into the '.junk' - section. This includes the code view .debug$ data and - stuff from .drectve sections */ - if (strcmp (s->name, ".drectve") == 0 || - strncmp (s->name, ".debug$", 7) == 0) - continue; -#endif - print_address (s->output_offset); - if (s->reloc_done) - { - fprintf (config.map_file, " %08x 2**%2ud %s\n", - (unsigned) bfd_get_section_size_after_reloc (s), - s->alignment_power, s->name); - } - - else - { - fprintf (config.map_file, " %08x 2**%2ud %s\n", - (unsigned) bfd_get_section_size_before_reloc (s), - s->alignment_power, s->name); - } - } - } - else - { - for (s = f->the_bfd->sections; - s != (asection *) NULL; - s = s->next) - { - fprintf (config.map_file, "%s ", s->name); - print_address (s->output_offset); - fprintf (config.map_file, "(%x)", - (unsigned) bfd_get_section_size_after_reloc (s)); - } - fprintf (config.map_file, "hex \n"); - } - } - print_nl (); -} - -/* Print a symbol. */ - -/*ARGSUSED*/ -static boolean -print_symbol (p, ignore) - struct bfd_link_hash_entry *p; - PTR ignore; -{ - while (p->type == bfd_link_hash_indirect - || p->type == bfd_link_hash_warning) - p = p->u.i.link; - - switch (p->type) - { - case bfd_link_hash_new: - abort (); - - case bfd_link_hash_undefined: - fprintf (config.map_file, "undefined "); - fprintf (config.map_file, "%s ", p->root.string); - print_nl (); - break; - - case bfd_link_hash_undefweak: - fprintf (config.map_file, "weak "); - fprintf (config.map_file, "%s ", p->root.string); - print_nl (); - break; - - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - { - asection *defsec = p->u.def.section; - - print_address (p->u.def.value); - if (defsec) - { - fprintf (config.map_file, " %-10s", - bfd_section_name (output_bfd, defsec)); - print_space (); - print_address (p->u.def.value + defsec->vma); - } - else - { - fprintf (config.map_file, " ......."); - } - fprintf (config.map_file, " %s", p->root.string); - if (p->type == bfd_link_hash_defweak) - fprintf (config.map_file, " [weak]"); - } - print_nl (); - break; - - case bfd_link_hash_common: - fprintf (config.map_file, "common "); - print_address (p->u.c.size); - fprintf (config.map_file, " %s ", p->root.string); - print_nl (); - break; - - default: - abort (); - } - - return true; } |