diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index f33388629164b59e07cdbac7bb4bce82e2f62b8b..f3f058934ea203cb735b9b4baf77ba8e8f854066 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -5040,7 +5040,7 @@ elfNN_c64_resize_sections (bfd *output_bfd, struct bfd_link_info *info, if (queue->sec->alignment_power < align) queue->sec->alignment_power = align; - padding = high - queue->sec->vma - queue->sec->size; + padding = high - low - queue->sec->size; if (queue->sec != pcc_high_sec) { @@ -5066,7 +5066,10 @@ elfNN_c64_resize_sections (bfd *output_bfd, struct bfd_link_info *info, if (pcc_low_sec->alignment_power < align) pcc_low_sec->alignment_power = align; - padding = pcc_high - pcc_high_sec->vma - pcc_high_sec->size; + bfd_vma current_length = + (pcc_high_sec->vma + pcc_high_sec->size) - pcc_low_sec->vma; + bfd_vma desired_length = (pcc_high - pcc_low); + padding = desired_length - current_length; c64_pad_section (pcc_high_sec, padding); } } diff --git a/ld/emultempl/aarch64elf.em b/ld/emultempl/aarch64elf.em index 95cee025e3dc7f0f573ed170db3a0f050b375e6f..8a123106e3df3a0236cf818051430b5ef27eca8e 100644 --- a/ld/emultempl/aarch64elf.em +++ b/ld/emultempl/aarch64elf.em @@ -216,7 +216,10 @@ elf64_c64_pad_section (asection *osec, bfd_vma padding) lang_output_section_statement_type *os = lang_output_section_get (osec); lang_list_init (&list); - lang_add_newdot (&list, osec->vma + osec->size + padding); + lang_add_assignment_internal (&list, + exp_assign (".", + exp_binop ('+', exp_nameop (NAME, "."), exp_intop (padding)), + FALSE)); if (list.head == NULL) { @@ -224,8 +227,8 @@ elf64_c64_pad_section (asection *osec, bfd_vma padding) return; } - *(list.tail) = os->header.next; - os->header.next = list.head; + *(list.tail) = NULL; + *(os->children.tail) = list.head; } } diff --git a/ld/ldlang.h b/ld/ldlang.h index 6074e2cb0129f60d7efbd44c8d9a14050b44f7c2..89ee85e557363811c63ac168ddc7aca9271e8d21 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -561,6 +561,8 @@ extern lang_assignment_statement_type *lang_add_assignment (union etree_union *); extern void lang_add_attribute (enum statement_enum); +extern void lang_add_assignment_internal + (lang_statement_list_type *, etree_type *); extern void lang_add_newdot (lang_statement_list_type *, bfd_vma); extern void lang_startup diff --git a/ld/ldlang.c b/ld/ldlang.c index fb9340603c2aa2f0dbf038ea975b192d0e95349f..09feb5b7e1fc63d0d1cde59754fc991fc3bf2dce 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -8370,6 +8370,15 @@ lang_add_assignment (etree_type *exp) return new_stmt; } +void +lang_add_assignment_internal (lang_statement_list_type *ptr, etree_type *exp) +{ + lang_assignment_statement_type *new_stmt; + + new_stmt = new_stat (lang_assignment_statement, ptr); + new_stmt->exp = exp; +} + void lang_add_newdot (lang_statement_list_type *ptr, bfd_vma newdot) {