X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Fpe.em;h=3899c9d92c8d43ce6596adef4092628f8bd6ba6c;hb=7e56227dfffddbbb5b648c386c85345929fa0529;hp=463b85481d8ef0952daf80b0d32795b11d50e94d;hpb=ddb000396c9246649e02669e0bd6ad3949973e5a;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 463b85481d..3899c9d92c 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -8,7 +8,7 @@ fi rm -f e${EMULATION_NAME}.c (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-) fragment <table, pr_sym, NULL); for (a = link_info.input_bfds; a; a = a->link.next) - printf ("*%s\n",a->filename); + printf ("*%s\n", bfd_get_filename (a)); } #endif @@ -1360,7 +1363,8 @@ gld_${EMULATION_NAME}_after_open (void) FIXME: This should be done via a function, rather than by including an internal BFD header. */ - if (coff_data (link_info.output_bfd) == NULL + if (bfd_get_flavour (link_info.output_bfd) != bfd_target_coff_flavour + || coff_data (link_info.output_bfd) == NULL || coff_data (link_info.output_bfd)->pe == 0) einfo (_("%F%P: cannot perform PE operations on non PE output file '%pB'\n"), link_info.output_bfd); @@ -1368,7 +1372,10 @@ gld_${EMULATION_NAME}_after_open (void) pe_data (link_info.output_bfd)->pe_opthdr = pe; pe_data (link_info.output_bfd)->dll = init[DLLOFF].value; pe_data (link_info.output_bfd)->real_flags |= real_flags; - pe_data (link_info.output_bfd)->insert_timestamp = insert_timestamp; + if (insert_timestamp) + pe_data (link_info.output_bfd)->timestamp = -1; + else + pe_data (link_info.output_bfd)->timestamp = 0; /* At this point we must decide whether to use long section names in the output or not. If the user hasn't explicitly specified @@ -1512,8 +1519,7 @@ gld_${EMULATION_NAME}_after_open (void) { struct bfd_symbol *s; struct bfd_link_hash_entry * blhe; - char *other_bfd_filename; - char *n; + const char *other_bfd_filename; s = (relocs[i]->sym_ptr_ptr)[0]; @@ -1540,9 +1546,9 @@ gld_${EMULATION_NAME}_after_open (void) continue; /* Rename this implib to match the other one. */ - n = xmalloc (strlen (other_bfd_filename) + 1); - strcpy (n, other_bfd_filename); - is->the_bfd->my_archive->filename = n; + if (!bfd_set_filename (is->the_bfd->my_archive, + other_bfd_filename)) + einfo ("%F%P: %pB: %E\n", is->the_bfd); } free (relocs); @@ -1589,7 +1595,7 @@ gld_${EMULATION_NAME}_after_open (void) members, so look for the first element with a .dll extension, and use that for the remainder of the comparisons. */ - pnt = strrchr (is3->the_bfd->filename, '.'); + pnt = strrchr (bfd_get_filename (is3->the_bfd), '.'); if (pnt != NULL && filename_cmp (pnt, ".dll") == 0) break; } @@ -1606,12 +1612,12 @@ gld_${EMULATION_NAME}_after_open (void) { /* Skip static members, ie anything with a .obj extension. */ - pnt = strrchr (is2->the_bfd->filename, '.'); + pnt = strrchr (bfd_get_filename (is2->the_bfd), '.'); if (pnt != NULL && filename_cmp (pnt, ".obj") == 0) continue; - if (filename_cmp (is3->the_bfd->filename, - is2->the_bfd->filename)) + if (filename_cmp (bfd_get_filename (is3->the_bfd), + bfd_get_filename (is2->the_bfd))) { is_ms_arch = 0; break; @@ -1623,7 +1629,7 @@ gld_${EMULATION_NAME}_after_open (void) /* This fragment might have come from an .obj file in a Microsoft import, and not an actual import record. If this is the case, then leave the filename alone. */ - pnt = strrchr (is->the_bfd->filename, '.'); + pnt = strrchr (bfd_get_filename (is->the_bfd), '.'); if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0)) { @@ -1645,13 +1651,14 @@ gld_${EMULATION_NAME}_after_open (void) else /* sentinel */ seq = 'c'; - new_name = xmalloc (strlen (is->the_bfd->filename) + 3); - sprintf (new_name, "%s.%c", is->the_bfd->filename, seq); - is->the_bfd->filename = new_name; - - new_name = xmalloc (strlen (is->filename) + 3); - sprintf (new_name, "%s.%c", is->filename, seq); - is->filename = new_name; + new_name + = xmalloc (strlen (bfd_get_filename (is->the_bfd)) + 3); + sprintf (new_name, "%s.%c", + bfd_get_filename (is->the_bfd), seq); + is->filename = bfd_set_filename (is->the_bfd, new_name); + free (new_name); + if (!is->filename) + einfo ("%F%P: %pB: %E\n", is->the_bfd); } } } @@ -1919,8 +1926,7 @@ gld_${EMULATION_NAME}_finish (void) /* Special procesing is required for a Thumb entry symbol. The bottom bit of its address must be set. */ val = (h->u.def.value - + bfd_get_section_vma (link_info.output_bfd, - h->u.def.section->output_section) + + bfd_section_vma (h->u.def.section->output_section) + h->u.def.section->output_offset); val |= 1; @@ -1947,6 +1953,7 @@ gld_${EMULATION_NAME}_finish (void) #ifdef DLL_SUPPORT if (bfd_link_pic (&link_info) #if !defined(TARGET_IS_shpe) + || pe_dll_enable_reloc_section || (!bfd_link_relocatable (&link_info) && pe_def_file->num_exports != 0) #endif @@ -2116,9 +2123,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, && (nexts->flags & SEC_EXCLUDE) == 0 && ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0 && (nexts->owner->flags & DYNAMIC) == 0 - && nexts->owner->usrdata != NULL - && !(((lang_input_statement_type *) nexts->owner->usrdata) - ->flags.just_syms)) + && !bfd_input_just_syms (nexts->owner)) flags = (((flags ^ SEC_READONLY) | (nexts->flags ^ SEC_READONLY)) ^ SEC_READONLY); @@ -2153,8 +2158,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, NULL); if (after == NULL) /* *ABS* is always the first output section statement. */ - after = (&lang_output_section_statement.head - ->output_section_statement); + after = (void *) lang_os_list.head; } /* All sections in an executable must be aligned to a page boundary. @@ -2165,7 +2169,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, &add_child); if (bfd_link_relocatable (&link_info)) { - os->section_alignment = s->alignment_power; + os->section_alignment = exp_intop (1U << s->alignment_power); os->bfd_section->alignment_power = s->alignment_power; } } @@ -2182,7 +2186,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, ls = &(*pl)->input_section; - lname = bfd_get_section_name (ls->section->owner, ls->section); + lname = bfd_section_name (ls->section); if (strchr (lname, '\$') != NULL && (dollar == NULL || strcmp (orig_secname, lname) < 0)) break; @@ -2350,6 +2354,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = gld_${EMULATION_NAME}_after_parse, gld_${EMULATION_NAME}_after_open, after_check_relocs_default, + before_place_orphans_default, after_allocation_default, set_output_arch_default, ldemul_default_target, @@ -2370,6 +2375,9 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = gld_${EMULATION_NAME}_recognized_file, gld_${EMULATION_NAME}_find_potential_libraries, NULL, /* new_vers_pattern. */ - NULL /* extra_map_file_text. */ + NULL, /* extra_map_file_text. */ + ${LDEMUL_EMIT_CTF_EARLY-NULL}, + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF