This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH 2/4] LD: Support fixed-size sections some psABIs may require
- From: "Maciej W. Rozycki" <macro at mips dot com>
- To: <binutils at sourceware dot org>
- Cc: Vlad Ivanov <vlad@ivanov.email>
- Date: Wed, 31 Jan 2018 22:57:22 +0000
- Subject: [PATCH 2/4] LD: Support fixed-size sections some psABIs may require
- Authentication-results: sourceware.org; auth=none
- References: <alpine.DEB.2.00.1801302217320.4074@tp.orcam.me.uk>
Define a SEC_FIXED_SIZE section flag for target backends to use for
output sections whose size has been fixed in the psABI. The size of
such sections will not be changed anyhow by the generic linker and it is
up to the target backend to get their size right.
bfd/
* section.c (SEC_FIXED_SIZE): New macro.
* bfd-in2.h: Regenerate.
ld/
* 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.
---
Hi,
No regressions across my usual targets. OK to apply?
Maciej
---
bfd/bfd-in2.h | 5 +++++
bfd/section.c | 5 +++++
ld/ldlang.c | 30 ++++++++++++++++++++----------
3 files changed, 30 insertions(+), 10 deletions(-)
binutils-section-fixed-size.diff
Index: binutils/bfd/bfd-in2.h
===================================================================
--- binutils.orig/bfd/bfd-in2.h 2018-01-31 20:38:09.548999454 +0000
+++ binutils/bfd/bfd-in2.h 2018-01-31 20:38:59.522971771 +0000
@@ -1324,6 +1324,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
Index: binutils/bfd/section.c
===================================================================
--- binutils.orig/bfd/section.c 2018-01-31 20:38:09.573532846 +0000
+++ binutils/bfd/section.c 2018-01-31 20:38:59.572911226 +0000
@@ -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
Index: binutils/ld/ldlang.c
===================================================================
--- binutils.orig/ld/ldlang.c 2018-01-31 20:38:09.584743216 +0000
+++ binutils/ld/ldlang.c 2018-01-31 20:38:59.629693927 +0000
@@ -4675,8 +4675,9 @@ insert_pad (lang_statement_union_type **
}
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;
}
}