diff options
Diffstat (limited to 'ld/pe-dll.c')
-rw-r--r-- | ld/pe-dll.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/ld/pe-dll.c b/ld/pe-dll.c index 3f2815e..f615b2d 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -615,7 +615,7 @@ auto_export (bfd *abfd, def_file *d, const char *n) } static void -process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) +process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) { int i, j; struct bfd_link_hash_entry *blhe; @@ -642,6 +642,28 @@ process_def_file (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) } } + /* Process aligned common symbol information from the + .drectve sections now; common symbol allocation is + done before final link, so it will be too late to + process them in process_embedded_commands() called + from _bfd_coff_link_input_bfd(). */ + if (pe_def_file->aligncomms) + { + def_file_aligncomm *ac = pe_def_file->aligncomms; + while (ac) + { + struct coff_link_hash_entry *sym_hash; + sym_hash = coff_link_hash_lookup (coff_hash_table (info), + ac->symbol_name, FALSE, FALSE, FALSE); + if (sym_hash && sym_hash->root.type == bfd_link_hash_common + && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment) + { + sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment; + } + ac = ac->next; + } + } + /* If we are not building a DLL, when there are no exports we do not build an export table at all. */ if (!pe_dll_export_everything && pe_def_file->num_exports == 0 @@ -1057,7 +1079,7 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED) } /* Fill the exported symbol offsets. The preliminary work has already - been done in process_def_file(). */ + been done in process_def_file_and_drectve(). */ static void fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) @@ -3066,7 +3088,7 @@ pe_dll_build_sections (bfd *abfd, struct bfd_link_info *info) { pe_dll_id_target (bfd_get_target (abfd)); pe_output_file_set_long_section_names (abfd); - process_def_file (abfd, info); + process_def_file_and_drectve (abfd, info); if (pe_def_file->num_exports == 0 && !info->shared) return; |