aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/bfd-in2.h5
-rw-r--r--bfd/section.c5
-rw-r--r--ld/ChangeLog8
-rw-r--r--ld/ldlang.c30
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;
}
}