[PATCH 1/7] ELF: Omit section header in ELF objects
H.J. Lu
hjl.tools@gmail.com
Tue Mar 10 00:12:17 GMT 2020
From: Kaylee Blake <klkblake@gmail.com>
Section header isn't mandatory on ELF executable nor shared library.
This patch adds a new linker option, -z nosectionheader, to omit ELF
section header when building an executable or shared library, an
objcopy and strip option, --remove-section-header, to remove ELF
section header from an executable or shared library.
bfd/
2020-03-XX H.J. Lu <hongjiu.lu@intel.com>
Kaylee Blake <klkblake@gmail.com>
PR ld/25617
* bfd.c (BFD_NO_SECTION_HEADER): New.
(BFD_FLAGS_SAVED): Add BFD_NO_SECTION_HEADER.
(BFD_FLAGS_FOR_BFD_USE_MASK): Likewise.
* elfcode.h (elf_swap_ehdr_out): Omit section header on
non-relocatable output with BFD_NO_SECTION_HEADER.
(elf_write_shdrs_and_ehdr): Likewise.
* elfxx-target.h (TARGET_BIG_SYM): Add BFD_NO_SECTION_HEADER
to object_flags.
(TARGET_LITTLE_SYM): Likewise.
* bfd-in2.h: Regenerated.
binutils/
2020-03-XX H.J. Lu <hongjiu.lu@intel.com>
PR ld/25617
* NEWS: Mention --remove-section-header for objcopy and strip.
* doc/binutils.texi: Document --remove-section-header for objcopy
and strip.
* objcopy.c (remove_section_header): New.
(command_line_switch): Add OPTION_REMOVE_SECTION_HEADER.
(strip_options): Add --remove-section-header.
(copy_options): Likewise.
(copy_usage): Add --remove-section-header.
(strip_usage): Likewise.
(copy_object): Renamed to ...
(copy_object_1): This. Issue a warning for
--remove-section-header on non-ELF targets.
(copy_object): New.
(strip_main): Handle OPTION_REMOVE_SECTION_HEADER.
(copy_main): Likewise.
ld/
2020-03-XX H.J. Lu <hongjiu.lu@intel.com>
Kaylee Blake <klkblake@gmail.com>
PR ld/25617
* NEWS: Mention -z nosectionheader.
* emultempl/elf.em: Support -z sectionheader and
-z nosectionheader.
* ld.h (ld_config_type): Add no_section_header.
* ld.texi: Document -z sectionheader and -z nosectionheader.
* ldlang.c (ldlang_open_output): Handle
config.no_section_header.
* lexsup.c (parse_args): Disallow -z nosectionheader with -r.
(elf_static_list_options): Add -z sectionheader and
-z nosectionheader.
---
bfd/bfd-in2.h | 8 ++++--
bfd/bfd.c | 8 ++++--
bfd/elfcode.h | 41 ++++++++++++++++++++++-------
bfd/elfxx-target.h | 6 +++--
binutils/NEWS | 3 +++
binutils/doc/binutils.texi | 12 +++++++++
binutils/objcopy.c | 54 ++++++++++++++++++++++++++++++++++++--
ld/NEWS | 3 +++
ld/emultempl/elf.em | 4 +++
ld/ld.h | 3 +++
ld/ld.texi | 6 +++++
ld/ldlang.c | 4 +++
ld/lexsup.c | 12 +++++++++
13 files changed, 146 insertions(+), 18 deletions(-)
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 37114607b5..d81d0e20dd 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -6588,17 +6588,21 @@ struct bfd
/* Put pathnames into archives (non-POSIX). */
#define BFD_ARCHIVE_FULL_PATH 0x100000
+ /* Don't generate ELF section header. */
+#define BFD_NO_SECTION_HEADER 0x200000
+
/* Flags bits to be saved in bfd_preserve_save. */
#define BFD_FLAGS_SAVED \
(BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
| BFD_PLUGIN | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON \
- | BFD_USE_ELF_STT_COMMON)
+ | BFD_USE_ELF_STT_COMMON | BFD_NO_SECTION_HEADER)
/* Flags bits which are for BFD use only. */
#define BFD_FLAGS_FOR_BFD_USE_MASK \
(BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
| BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT \
- | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON)
+ | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON \
+ | BFD_NO_SECTION_HEADER)
/* The format which belongs to the BFD. (object, core, etc.) */
ENUM_BITFIELD (bfd_format) format : 3;
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 1c1238c036..366e662592 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -176,17 +176,21 @@ CODE_FRAGMENT
. {* Put pathnames into archives (non-POSIX). *}
.#define BFD_ARCHIVE_FULL_PATH 0x100000
.
+. {* Don't generate ELF section header. *}
+.#define BFD_NO_SECTION_HEADER 0x200000
+.
. {* Flags bits to be saved in bfd_preserve_save. *}
.#define BFD_FLAGS_SAVED \
. (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
. | BFD_PLUGIN | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON \
-. | BFD_USE_ELF_STT_COMMON)
+. | BFD_USE_ELF_STT_COMMON | BFD_NO_SECTION_HEADER)
.
. {* Flags bits which are for BFD use only. *}
.#define BFD_FLAGS_FOR_BFD_USE_MASK \
. (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
. | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT \
-. | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON)
+. | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON \
+. | BFD_NO_SECTION_HEADER)
.
. {* The format which belongs to the BFD. (object, core, etc.) *}
. ENUM_BITFIELD (bfd_format) format : 3;
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index 18a6dac64e..4dde24e02a 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -266,6 +266,10 @@ elf_swap_ehdr_out (bfd *abfd,
{
unsigned int tmp;
int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
+ /* Relocatable object must have section header. */
+ bfd_boolean no_section_header
+ = ((abfd->flags & BFD_NO_SECTION_HEADER) != 0
+ && (abfd->flags & (EXEC_P | DYNAMIC)) != 0);
memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
/* note that all elements of dst are *arrays of unsigned char* already... */
H_PUT_16 (abfd, src->e_type, dst->e_type);
@@ -276,7 +280,10 @@ elf_swap_ehdr_out (bfd *abfd,
else
H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
- H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
+ if (no_section_header)
+ H_PUT_WORD (abfd, 0, dst->e_shoff);
+ else
+ H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
H_PUT_32 (abfd, src->e_flags, dst->e_flags);
H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
@@ -284,15 +291,24 @@ elf_swap_ehdr_out (bfd *abfd,
if (tmp > PN_XNUM)
tmp = PN_XNUM;
H_PUT_16 (abfd, tmp, dst->e_phnum);
- H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
- tmp = src->e_shnum;
- if (tmp >= (SHN_LORESERVE & 0xffff))
- tmp = SHN_UNDEF;
- H_PUT_16 (abfd, tmp, dst->e_shnum);
- tmp = src->e_shstrndx;
- if (tmp >= (SHN_LORESERVE & 0xffff))
- tmp = SHN_XINDEX & 0xffff;
- H_PUT_16 (abfd, tmp, dst->e_shstrndx);
+ if (no_section_header)
+ {
+ H_PUT_16 (abfd, 0, dst->e_shentsize);
+ H_PUT_16 (abfd, 0, dst->e_shnum);
+ H_PUT_16 (abfd, 0, dst->e_shstrndx);
+ }
+ else
+ {
+ H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
+ tmp = src->e_shnum;
+ if (tmp >= (SHN_LORESERVE & 0xffff))
+ tmp = SHN_UNDEF;
+ H_PUT_16 (abfd, tmp, dst->e_shnum);
+ tmp = src->e_shstrndx;
+ if (tmp >= (SHN_LORESERVE & 0xffff))
+ tmp = SHN_XINDEX & 0xffff;
+ H_PUT_16 (abfd, tmp, dst->e_shstrndx);
+ }
}
/* Translate an ELF section header table entry in external format into an
@@ -1041,6 +1057,11 @@ elf_write_shdrs_and_ehdr (bfd *abfd)
|| bfd_bwrite (&x_ehdr, amt, abfd) != amt)
return FALSE;
+ /* Relocatable object must have section header. */
+ if ((abfd->flags & BFD_NO_SECTION_HEADER) != 0
+ && (abfd->flags & (EXEC_P | DYNAMIC)) != 0)
+ return TRUE;
+
/* Some fields in the first section header handle overflow of ehdr
fields. */
if (i_ehdrp->e_phnum >= PN_XNUM)
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index 1ae17f45ee..8d25c84e80 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -970,7 +970,8 @@ const bfd_target TARGET_BIG_SYM =
/* object_flags: mask of all file flags */
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
| DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS
- | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON),
+ | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON
+ | BFD_NO_SECTION_HEADER),
/* section_flags: mask of all section flags */
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY
@@ -1071,7 +1072,8 @@ const bfd_target TARGET_LITTLE_SYM =
/* object_flags: mask of all file flags */
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
| DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS
- | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON),
+ | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON
+ | BFD_NO_SECTION_HEADER),
/* section_flags: mask of all section flags */
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY
diff --git a/binutils/NEWS b/binutils/NEWS
index 1650a3ac93..5116e2eedc 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -1,5 +1,8 @@
-*- text -*-
+* Add command-line option, --remove-section-header, to objcopy and strip
+ to remove ELF section header from an executable or shared library.
+
Changes in 2.34:
* Binutils now supports debuginfod, an HTTP server for distributing
diff --git a/binutils/doc/binutils.texi b/binutils/doc/binutils.texi
index de3f1babb2..ece82e9e39 100644
--- a/binutils/doc/binutils.texi
+++ b/binutils/doc/binutils.texi
@@ -1186,6 +1186,7 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}]
[@option{-R} @var{sectionpattern}|@option{--remove-section=}@var{sectionpattern}]
[@option{--keep-section=}@var{sectionpattern}]
[@option{--remove-relocations=}@var{sectionpattern}]
+ [@option{--remove-section-header}]
[@option{-p}|@option{--preserve-dates}]
[@option{-D}|@option{--enable-deterministic-archives}]
[@option{-U}|@option{--disable-deterministic-archives}]
@@ -1403,6 +1404,11 @@ will remove all relocations for sections matching the pattern
'.text.*', but will not remove relocations for the section
'.text.foo'.
+@item --remove-section-header
+Remove section header from an ELF executable or shared object. This
+option is specific to ELF files and is ignored on relocatable object
+files. Implies @option{--strip-all} and @option{--merge-notes}.
+
@item -S
@itemx --strip-all
Do not copy relocation and symbol information from the source file.
@@ -3262,6 +3268,7 @@ strip [@option{-F} @var{bfdname} |@option{--target=}@var{bfdname}]
[@option{-R} @var{sectionname} |@option{--remove-section=}@var{sectionname}]
[@option{--keep-section=}@var{sectionpattern}]
[@option{--remove-relocations=}@var{sectionpattern}]
+ [@option{--remove-section-header}]
[@option{-o} @var{file}] [@option{-p}|@option{--preserve-dates}]
[@option{-D}|@option{--enable-deterministic-archives}]
[@option{-U}|@option{--disable-deterministic-archives}]
@@ -3363,6 +3370,11 @@ will remove all relocations for sections matching the pattern
'.text.*', but will not remove relocations for the section
'.text.foo'.
+@item --remove-section-header
+Remove section header from an ELF executable or shared object. This
+option is specific to ELF files and is ignored on relocatable object
+files. Implies @option{--strip-all} and @option{--merge-notes}.
+
@item -s
@itemx --strip-all
Remove all symbols.
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 09facf0061..10891bc3f0 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -96,6 +96,9 @@ static bfd_boolean preserve_dates; /* Preserve input file timestamp. */
static int deterministic = -1; /* Enable deterministic archives. */
static int status = 0; /* Exit status. */
+/* Remove section header. */
+static bfd_boolean remove_section_header = FALSE;
+
static bfd_boolean merge_notes = FALSE; /* Merge note sections. */
typedef struct merged_note_section
@@ -352,6 +355,7 @@ enum command_line_switch
OPTION_REDEFINE_SYMS,
OPTION_REMOVE_LEADING_CHAR,
OPTION_REMOVE_RELOCS,
+ OPTION_REMOVE_SECTION_HEADER,
OPTION_RENAME_SECTION,
OPTION_REVERSE_BYTES,
OPTION_PE_SECTION_ALIGNMENT,
@@ -399,6 +403,7 @@ static struct option strip_options[] =
{"preserve-dates", no_argument, 0, 'p'},
{"remove-section", required_argument, 0, 'R'},
{"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
+ {"remove-section-header", no_argument, 0, OPTION_REMOVE_SECTION_HEADER},
{"strip-all", no_argument, 0, 's'},
{"strip-debug", no_argument, 0, 'S'},
{"strip-dwo", no_argument, 0, OPTION_STRIP_DWO},
@@ -487,6 +492,7 @@ static struct option copy_options[] =
{"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
{"remove-section", required_argument, 0, 'R'},
{"remove-relocations", required_argument, 0, OPTION_REMOVE_RELOCS},
+ {"remove-section-header", no_argument, 0, OPTION_REMOVE_SECTION_HEADER},
{"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
{"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
{"section-alignment", required_argument, 0, OPTION_PE_SECTION_ALIGNMENT},
@@ -582,6 +588,7 @@ copy_usage (FILE *stream, int exit_status)
--add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
-R --remove-section <name> Remove section <name> from the output\n\
--remove-relocations <name> Remove relocations from section <name>\n\
+ --remove-section-header Remove section header from the output\n\
-S --strip-all Remove all symbol and relocation information\n\
-g --strip-debug Remove all debugging symbols & sections\n\
--strip-dwo Remove all DWO sections\n\
@@ -719,6 +726,7 @@ strip_usage (FILE *stream, int exit_status)
fprintf (stream, _("\
-R --remove-section=<name> Also remove section <name> from the output\n\
--remove-relocations <name> Remove relocations from section <name>\n\
+ --remove-section-header Remove section header from the output\n\
-s --strip-all Remove all symbol and relocation information\n\
-g -S -d --strip-debug Remove all debugging symbols & sections\n\
--strip-dwo Remove all DWO sections\n\
@@ -2583,7 +2591,7 @@ check_new_section_flags (flagword flags, bfd * abfd, const char * secname)
Returns TRUE upon success, FALSE otherwise. */
static bfd_boolean
-copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
+copy_object_1 (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
{
bfd_vma start;
long symcount;
@@ -2637,6 +2645,13 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
bfd_get_archive_filename (ibfd));
return FALSE;
}
+
+ if (remove_section_header)
+ {
+ non_fatal (_("--remove_section_header is unsupported on `%s'"),
+ bfd_get_archive_filename (ibfd));
+ return FALSE;
+ }
}
if (verbose)
@@ -3360,7 +3375,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
free (merged);
}
}
- else if (merge_notes && ! is_strip)
+ else if (merge_notes && ! is_strip && ! remove_section_header)
non_fatal (_("%s: Could not find any mergeable note sections"),
bfd_get_filename (ibfd));
@@ -3458,6 +3473,34 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
return TRUE;
}
+/* Copy object file IBFD onto OBFD, preserve strip_symbols and
+ * saved_merge_notes, which may be changed by --remove-section-header.
+ Returns TRUE upon success, FALSE otherwise. */
+
+static bfd_boolean
+copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
+{
+ enum strip_action saved_strip_symbols = strip_symbols;
+ bfd_boolean saved_merge_notes = merge_notes;
+ bfd_boolean res;
+
+ if (bfd_get_flavour (ibfd) == bfd_target_elf_flavour
+ && remove_section_header
+ && (ibfd->flags & (EXEC_P | DYNAMIC)) != 0)
+ {
+ ibfd->flags |= BFD_NO_SECTION_HEADER;
+ strip_symbols = STRIP_ALL;
+ merge_notes = TRUE;
+ }
+
+ res = copy_object_1 (ibfd, obfd, input_arch);
+
+ strip_symbols = saved_strip_symbols;
+ merge_notes = saved_merge_notes;
+
+ return res;
+}
+
/* Read each archive element in turn from IBFD, copy the
contents to temp file, and keep the temp file handle.
If 'force_output_target' is TRUE then make sure that
@@ -4671,6 +4714,9 @@ strip_main (int argc, char *argv[])
case OPTION_REMOVE_RELOCS:
handle_remove_relocations_option (optarg);
break;
+ case OPTION_REMOVE_SECTION_HEADER:
+ remove_section_header = TRUE;
+ break;
case 's':
strip_symbols = STRIP_ALL;
break;
@@ -5102,6 +5148,10 @@ copy_main (int argc, char *argv[])
handle_remove_relocations_option (optarg);
break;
+ case OPTION_REMOVE_SECTION_HEADER:
+ remove_section_header = TRUE;
+ break;
+
case 'S':
strip_symbols = STRIP_ALL;
break;
diff --git a/ld/NEWS b/ld/NEWS
index 7734d23d5b..79cad101a6 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,5 +1,8 @@
-*- text -*-
+* Add command-line option, -z nosectionheader, to omit ELF section header
+ when building an executable or shared library.
+
Changes in 2.34:
* The ld check for "PHDR segment not covered by LOAD segment" is more
diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em
index bb7e537530..1ce1af1236 100644
--- a/ld/emultempl/elf.em
+++ b/ld/emultempl/elf.em
@@ -752,6 +752,10 @@ fragment <<EOF
{
link_info.flags_1 |= DF_1_GLOBAUDIT;
}
+ else if (strcmp (optarg, "sectionheader") == 0)
+ config.no_section_header = FALSE;
+ else if (strcmp (optarg, "nosectionheader") == 0)
+ config.no_section_header = TRUE;
EOF
if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
diff --git a/ld/ld.h b/ld/ld.h
index 71fd781267..4c07604e5d 100644
--- a/ld/ld.h
+++ b/ld/ld.h
@@ -280,6 +280,9 @@ typedef struct
/* If set, code and non-code sections should never be in one segment. */
bfd_boolean separate_code;
+ /* If set, generation of ELF section header should be suppressed. */
+ bfd_boolean no_section_header;
+
/* The rpath separation character. Usually ':'. */
char rpath_separator;
diff --git a/ld/ld.texi b/ld/ld.texi
index 27343c798f..54ba174cc2 100644
--- a/ld/ld.texi
+++ b/ld/ld.texi
@@ -1295,6 +1295,12 @@ relocation, if supported. Specifying @samp{common-page-size} smaller
than the system page size will render this protection ineffective.
Don't create an ELF @code{PT_GNU_RELRO} segment if @samp{norelro}.
+@item sectionheader
+@itemx nosectionheader
+Generate section header when building an executable or shared library.
+Don't generate section header if @samp{sectionheader} is used.
+@option{sectionheader} is the default.
+
@item separate-code
@itemx noseparate-code
Create separate code @code{PT_LOAD} segment header in the object. This
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 63f9d182ea..df187c21bf 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -3432,6 +3432,10 @@ ldlang_open_output (lang_statement_union_type *statement)
link_info.output_bfd->flags |= BFD_TRADITIONAL_FORMAT;
else
link_info.output_bfd->flags &= ~BFD_TRADITIONAL_FORMAT;
+ if (config.no_section_header)
+ link_info.output_bfd->flags |= BFD_NO_SECTION_HEADER;
+ else
+ link_info.output_bfd->flags &= ~BFD_NO_SECTION_HEADER;
break;
case lang_target_statement_enum:
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 3d15cc491d..621c8d6605 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -1676,6 +1676,14 @@ parse_args (unsigned argc, char **argv)
break;
}
+ if (config.no_section_header)
+ {
+ if (link_info.type == type_relocatable)
+ einfo (_("%F%P: -r and -z nosectionheader may not be used together\n"));
+ /* -z nosectionheader implies --strip-all. */
+ link_info.strip = strip_all;
+ }
+
if (!bfd_link_dll (&link_info))
{
if (command_line.filter_shlib)
@@ -1879,6 +1887,10 @@ elf_static_list_options (FILE *file)
-z noexecstack Mark executable as not requiring executable stack\n"));
fprintf (file, _("\
-z globalaudit Mark executable requiring global auditing\n"));
+ fprintf (file, _("\
+ -z sectionheader Generate section header (default)\n"));
+ fprintf (file, _("\
+ -z nosectionheader Do not generate section header\n"));
}
static void
--
2.24.1
More information about the Binutils
mailing list