From 9a951beb03d7a4a8c1b6784bd06fdecfc1b3855d Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Wed, 8 Nov 2000 07:54:31 +0000 Subject: [PATCH] * elf64-ia64.c (elf64_ia64_final_link): New local unwind_output_sec. Set it before bfd_elf64_bfd_final_link call. Use it after the call. * section.c (bfd_set_section_contents): Call memcpy if section->contents set and location not equal to contents plus offset. --- bfd/ChangeLog | 7 +++++++ bfd/elfxx-ia64.c | 44 ++++++++++++++++++++++++-------------------- bfd/section.c | 5 +++++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ccf9c6ac783..33511939f76 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2000-11-07 Richard Henderson + + * elfxx-ia64.c (elf64_ia64_final_link): New local unwind_output_sec. + Set it before bfd_elf64_bfd_final_link call. Use it after the call. + * section.c (bfd_set_section_contents): Call memcpy if + section->contents set and location not equal to contents plus offset. + 2000-11-08 Kazu Hirata * bfd.c: Fix formatting. diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c index 1e319bc34f5..d5c5f023c96 100644 --- a/bfd/elfxx-ia64.c +++ b/bfd/elfxx-ia64.c @@ -2998,6 +2998,8 @@ elfNN_ia64_final_link (abfd, info) struct bfd_link_info *info; { struct elfNN_ia64_link_hash_table *ia64_info; + asection *unwind_output_sec; + ia64_info = elfNN_ia64_hash_table (info); /* Make sure we've got ourselves a nice fat __gp value. */ @@ -3152,33 +3154,37 @@ elfNN_ia64_final_link (abfd, info) } } - /* Invoke the regular ELF backend linker to do all the work. */ - if (!bfd_elfNN_bfd_final_link (abfd, info)) - return false; - /* If we're producing a final executable, we need to sort the contents - of the .IA_64.unwind section. */ + of the .IA_64.unwind section. Force this section to be relocated + into memory rather than written immediately to the output file. */ + unwind_output_sec = NULL; if (!info->relocateable) { asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind); if (s) { - bfd_size_type size = s->output_section->_raw_size; - char *contents = bfd_malloc (size); - - if (contents == NULL) - return false; - if (! bfd_get_section_contents (abfd, s->output_section, - contents, (file_ptr) 0, size)) + unwind_output_sec = s->output_section; + unwind_output_sec->contents + = bfd_malloc (unwind_output_sec->_raw_size); + if (unwind_output_sec->contents == NULL) return false; + } + } - elfNN_ia64_unwind_entry_compare_bfd = abfd; - qsort (contents, size / 24, 24, elfNN_ia64_unwind_entry_compare); + /* Invoke the regular ELF backend linker to do all the work. */ + if (!bfd_elfNN_bfd_final_link (abfd, info)) + return false; - if (! bfd_set_section_contents (abfd, s->output_section, - contents, (file_ptr) 0, size)) - return false; - } + if (unwind_output_sec) + { + elfNN_ia64_unwind_entry_compare_bfd = abfd; + qsort (unwind_output_sec->contents, unwind_output_sec->_raw_size / 24, + 24, elfNN_ia64_unwind_entry_compare); + + if (! bfd_set_section_contents (abfd, unwind_output_sec, + unwind_output_sec->contents, 0, + unwind_output_sec->_raw_size)) + return false; } return true; @@ -3885,8 +3891,6 @@ elfNN_ia64_finish_dynamic_sections (abfd, info) for (; dyncon < dynconend; dyncon++) { Elf_Internal_Dyn dyn; - const char *name; - asection *s; bfd_elfNN_swap_dyn_in (dynobj, dyncon, &dyn); diff --git a/bfd/section.c b/bfd/section.c index ef7a7e6fe2a..38683fccc39 100644 --- a/bfd/section.c +++ b/bfd/section.c @@ -1081,6 +1081,11 @@ bfd_set_section_contents (abfd, section, location, offset, count) break; } + /* Record a copy of the data in memory if desired. */ + if (section->contents + && location != section->contents + offset) + memcpy (section->contents + offset, location, count); + if (BFD_SEND (abfd, _bfd_set_section_contents, (abfd, section, location, offset, count))) { -- 2.30.2