aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2022-02-16 17:41:23 +0000
committerNick Clifton <nickc@redhat.com>2022-02-16 17:41:23 +0000
commitc212f39d9a82c6c09f4a1447d9d2ff09843827c5 (patch)
tree4dcd736239b6373674032ce36fa62ecd9ea67883 /bfd
parent1f841a9348f189a8ee4423eb416d6e5495b5b49d (diff)
downloadgdb-c212f39d9a82c6c09f4a1447d9d2ff09843827c5.zip
gdb-c212f39d9a82c6c09f4a1447d9d2ff09843827c5.tar.gz
gdb-c212f39d9a82c6c09f4a1447d9d2ff09843827c5.tar.bz2
ld: Support customized output section type
bfd/ PR ld/28841 * bfd-in2.h (struct bfd_section): Add type. (discarded_section): Add field. * elf.c (elf_fake_sections): Handle bfd_section::type. * section.c (BFD_FAKE_SECTION): Add field. * mri.c (mri_draw_tree): Update function call. ld/ PR ld/28841 * ld.texi: Document new output section type. * ldlex.l: Add new token TYPE. * ldgram.y: Handle TYPE=exp. * ldlang.h: Add type_section to list of section types. * ldlang.c (lang_add_section): Handle type_section. (map_input_to_output_sections): Handle type_section. * testsuite/ld-scripts/output-section-types.t: Add tests. * testsuite/ld-scripts/output-section-types.d: Update.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/bfd-in2.h7
-rw-r--r--bfd/elf.c4
-rw-r--r--bfd/section.c4
4 files changed, 20 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 97026b0..e959a78 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2022-02-16 Fangrui Song <maskray@google.com>
+ Nick Clifton <nickc@redhat.com>
+
+ PR ld/28841
+ * bfd-in2.h (struct bfd_section): Add type.
+ (discarded_section): Add field.
+ * elf.c (elf_fake_sections): Handle bfd_section::type.
+ * section.c (BFD_FAKE_SECTION): Add field.
+ * mri.c (mri_draw_tree): Update function call.
+
2022-02-11 Michael Forney <mforney@mforney.org>
* bfd.c (bfd_set_gp_value): Remove return with expression
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 3b2a4f4..78a0a1d 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1170,6 +1170,9 @@ typedef struct bfd_section
This is used when support for non-contiguous memory regions is enabled. */
struct bfd_section *already_assigned;
+ /* Explicitly specified section type, if non-zero. */
+ unsigned int type;
+
} asection;
/* Relax table contains information about instructions which can
@@ -1352,8 +1355,8 @@ discarded_section (const asection *sec)
/* symbol, symbol_ptr_ptr, */ \
(struct bfd_symbol *) SYM, &SEC.symbol, \
\
- /* map_head, map_tail, already_assigned */ \
- { NULL }, { NULL }, NULL \
+ /* map_head, map_tail, already_assigned, type */ \
+ { NULL }, { NULL }, NULL, 0 \
\
}
diff --git a/bfd/elf.c b/bfd/elf.c
index a67415e..82b53be 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3280,7 +3280,9 @@ elf_fake_sections (bfd *abfd, asection *asect, void *fsarg)
/* If the section type is unspecified, we set it based on
asect->flags. */
- if ((asect->flags & SEC_GROUP) != 0)
+ if (asect->type != 0)
+ sh_type = asect->type;
+ else if ((asect->flags & SEC_GROUP) != 0)
sh_type = SHT_GROUP;
else
sh_type = bfd_elf_get_default_section_type (asect->flags);
diff --git a/bfd/section.c b/bfd/section.c
index 899438a..2de7dbf 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -737,8 +737,8 @@ CODE_FRAGMENT
. {* symbol, symbol_ptr_ptr, *} \
. (struct bfd_symbol *) SYM, &SEC.symbol, \
. \
-. {* map_head, map_tail, already_assigned *} \
-. { NULL }, { NULL }, NULL \
+. {* map_head, map_tail, already_assigned, type *} \
+. { NULL }, { NULL }, NULL, 0 \
. \
. }
.