diff options
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 5 | ||||
-rw-r--r-- | bfd/section.c | 5 | ||||
-rw-r--r-- | ld/ChangeLog | 8 | ||||
-rw-r--r-- | ld/ldlang.c | 30 |
5 files changed, 43 insertions, 10 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e4c33c7..b84a3d1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,10 @@ 2018-02-19 Maciej W. Rozycki <macro@mips.com> + * section.c (SEC_FIXED_SIZE): New macro. + * bfd-in2.h: Regenerate. + +2018-02-19 Maciej W. Rozycki <macro@mips.com> + * section.c (SEC_HAS_GOT_REF): Remove macro. * bfd-in2.h: Regenerate. diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 2901488..9742c1a 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1342,6 +1342,11 @@ typedef struct bfd_section /* The section contains thread local data. */ #define SEC_THREAD_LOCAL 0x400 + /* The section's size is fixed. Generic linker code will not + recalculate it and it is up to whoever has set this flag to + get the size right. */ +#define SEC_FIXED_SIZE 0x800 + /* The section contains common symbols (symbols may be defined multiple times, the value of a symbol is the amount of space it requires, and the largest symbol value is the one diff --git a/bfd/section.c b/bfd/section.c index de4ca3a..6aa18d5 100644 --- a/bfd/section.c +++ b/bfd/section.c @@ -221,6 +221,11 @@ CODE_FRAGMENT . {* The section contains thread local data. *} .#define SEC_THREAD_LOCAL 0x400 . +. {* The section's size is fixed. Generic linker code will not +. recalculate it and it is up to whoever has set this flag to +. get the size right. *} +.#define SEC_FIXED_SIZE 0x800 +. . {* The section contains common symbols (symbols may be defined . multiple times, the value of a symbol is the amount of . space it requires, and the largest symbol value is the one diff --git a/ld/ChangeLog b/ld/ChangeLog index 84c6d3e..4f5cd5f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2018-02-19 Maciej W. Rozycki <macro@mips.com> + + * ldlang.c (insert_pad): Do not change output section's size if + SEC_FIXED_SIZE is set in the flags. + (size_input_section): Likewise. + (lang_size_sections_1): Likewise. + (lang_reset_memory_regions): Likewise. + 2018-02-19 Alan Modra <amodra@gmail.com> * ldmisc.c (vfinfo) Handle %pI, %pR, %pS and %pT in place of diff --git a/ld/ldlang.c b/ld/ldlang.c index 1a6f2cf..5401982 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -4675,8 +4675,9 @@ insert_pad (lang_statement_union_type **ptr, } pad->padding_statement.output_offset = dot - output_section->vma; pad->padding_statement.size = alignment_needed; - output_section->size = TO_SIZE (dot + TO_ADDR (alignment_needed) - - output_section->vma); + if (!(output_section->flags & SEC_FIXED_SIZE)) + output_section->size = TO_SIZE (dot + TO_ADDR (alignment_needed) + - output_section->vma); } /* Work out how much this section will move the dot point. */ @@ -4725,7 +4726,8 @@ size_input_section /* Mark how big the output section must be to contain this now. */ dot += TO_ADDR (i->size); - o->size = TO_SIZE (dot - o->vma); + if (!(o->flags & SEC_FIXED_SIZE)) + o->size = TO_SIZE (dot - o->vma); } return dot; @@ -5079,7 +5081,8 @@ lang_size_sections_1 bfd_set_section_vma (os->bfd_section->owner, os->bfd_section, bfd_section_vma (input->owner, input)); - os->bfd_section->size = input->size; + if (!(os->bfd_section->flags & SEC_FIXED_SIZE)) + os->bfd_section->size = input->size; break; } @@ -5194,7 +5197,9 @@ lang_size_sections_1 + os->block_value - 1) & - (bfd_vma) os->block_value); - os->bfd_section->size = TO_SIZE (after - os->bfd_section->vma); + if (!(os->bfd_section->flags & SEC_FIXED_SIZE)) + os->bfd_section->size = TO_SIZE (after + - os->bfd_section->vma); } /* Set section lma. */ @@ -5379,8 +5384,10 @@ lang_size_sections_1 if (size < TO_SIZE ((unsigned) 1)) size = TO_SIZE ((unsigned) 1); dot += TO_ADDR (size); - output_section_statement->bfd_section->size - = TO_SIZE (dot - output_section_statement->bfd_section->vma); + if (!(output_section_statement->bfd_section->flags + & SEC_FIXED_SIZE)) + output_section_statement->bfd_section->size + = TO_SIZE (dot - output_section_statement->bfd_section->vma); } break; @@ -5395,8 +5402,10 @@ lang_size_sections_1 output_section_statement->bfd_section; size = bfd_get_reloc_size (s->reloc_statement.howto); dot += TO_ADDR (size); - output_section_statement->bfd_section->size - = TO_SIZE (dot - output_section_statement->bfd_section->vma); + if (!(output_section_statement->bfd_section->flags + & SEC_FIXED_SIZE)) + output_section_statement->bfd_section->size + = TO_SIZE (dot - output_section_statement->bfd_section->vma); } break; @@ -6764,7 +6773,8 @@ lang_reset_memory_regions (void) { /* Save the last size for possible use by bfd_relax_section. */ o->rawsize = o->size; - o->size = 0; + if (!(o->flags & SEC_FIXED_SIZE)) + o->size = 0; } } |