X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Fpe.em;h=3899c9d92c8d43ce6596adef4092628f8bd6ba6c;hb=d27c357a5b83773054e85ff3ea5dbfe18b9dd3c0;hp=06cfe7d45d666595d83b0d3e0113dd12832d6f86;hpb=317ff0084bc68bfae2eabd82015e9239a68b5195;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 06cfe7d45d..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 @@ -1362,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); @@ -1370,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 @@ -1416,7 +1421,6 @@ gld_${EMULATION_NAME}_after_open (void) #if defined (TARGET_IS_i386pe) \ || defined (TARGET_IS_armpe) \ - || defined (TARGET_IS_arm_epoc_pe) \ || defined (TARGET_IS_arm_wince_pe) if (!bfd_link_relocatable (&link_info)) pe_dll_build_sections (link_info.output_bfd, &link_info); @@ -1428,7 +1432,7 @@ gld_${EMULATION_NAME}_after_open (void) #endif #endif /* DLL_SUPPORT */ -#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) +#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL) { /* The arm backend needs special fields in the output hash structure. @@ -1515,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]; @@ -1543,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); @@ -1592,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; } @@ -1609,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; @@ -1626,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)) { @@ -1648,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); } } } @@ -1754,7 +1758,7 @@ gld_${EMULATION_NAME}_before_allocation (void) ppc_allocate_toc_section (&link_info); #endif /* TARGET_IS_ppcpe */ -#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) +#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) /* FIXME: we should be able to set the size of the interworking stub section. @@ -1776,7 +1780,7 @@ gld_${EMULATION_NAME}_before_allocation (void) /* We have seen it all. Allocate it, and carry on. */ bfd_arm_allocate_interworking_sections (& link_info); -#endif /* TARGET_IS_armpe || TARGET_IS_arm_epoc_pe || TARGET_IS_arm_wince_pe */ +#endif /* TARGET_IS_armpe || TARGET_IS_arm_wince_pe */ before_allocation_default (); } @@ -1891,9 +1895,6 @@ gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUT #ifdef TARGET_IS_armpe pe_dll_id_target ("pei-arm-little"); #endif -#ifdef TARGET_IS_arm_epoc_pe - pe_dll_id_target ("epoc-pei-arm-little"); -#endif #ifdef TARGET_IS_arm_wince_pe pe_dll_id_target ("pei-arm-wince-little"); #endif @@ -1906,7 +1907,7 @@ gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUT static void gld_${EMULATION_NAME}_finish (void) { -#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) +#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) struct bfd_link_hash_entry * h; if (thumb_entry_symbol != NULL) @@ -1925,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; @@ -1946,13 +1946,14 @@ gld_${EMULATION_NAME}_finish (void) else einfo (_("%P: warning: cannot find thumb start symbol %s\n"), thumb_entry_symbol); } -#endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) */ +#endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) */ finish_default (); #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 @@ -2122,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); @@ -2159,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. @@ -2171,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; } } @@ -2188,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; @@ -2356,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, @@ -2376,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