[PATCH] ld: Add support for a new option, -exclude-symbols, in COFF object file directives
Martin Storsjo
martin@martin.st
Tue Jul 19 20:33:30 GMT 2022
More information about the Binutils mailing list
Tue Jul 19 20:33:30 GMT 2022
- Previous message (by thread): [PATCH] [AArch64] Support AArch64 MTE memory tag dumps in core files
- Next message (by thread): [PATCH] ld: Add support for a new option, -exclude-symbols, in COFF object file directives
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
This maps to the same as ld's --exclude-symbols command line option, but allowing specifying the option via directives embedded in the object files instead of passed manually on the command line. --- I've posted a corresponding patch to LLD in https://reviews.llvm.org/D130120 - I'd like to have support for it in both linkers before I'd take the option into use. --- ld/deffile.h | 6 ++++++ ld/deffilep.y | 43 ++++++++++++++++++++++++++++++++++++++++++- ld/pe-dll.c | 10 ++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/ld/deffile.h b/ld/deffile.h index d68fa8c6ba1..306ae3a6f75 100644 --- a/ld/deffile.h +++ b/ld/deffile.h @@ -61,6 +61,11 @@ typedef struct def_file_aligncomm { unsigned int alignment; /* log-2 alignment. */ } def_file_aligncomm; +typedef struct def_file_exclude_symbol { + struct def_file_exclude_symbol *next; /* Chain pointer. */ + char *symbol_name; /* Name of excluded symbol. */ +} def_file_exclude_symbol; + typedef struct def_file { /* From the NAME or LIBRARY command. */ char *name; @@ -94,6 +99,7 @@ typedef struct def_file { /* Only expected from .drectve sections, not .DEF files. */ def_file_aligncomm *aligncomms; + def_file_exclude_symbol *exclude_symbols; } def_file; diff --git a/ld/deffilep.y b/ld/deffilep.y index 3f610ddbe14..a7db23eace6 100644 --- a/ld/deffilep.y +++ b/ld/deffilep.y @@ -101,6 +101,7 @@ static void def_stacksize (int, int); static void def_version (int, int); static void def_directive (char *); static void def_aligncomm (char *str, int align); +static void def_exclude_symbols (char *str); static int def_parse (void); static void def_error (const char *); static int def_lex (void); @@ -121,7 +122,7 @@ static const char *lex_parse_string_end = 0; %token NAME LIBRARY DESCRIPTION STACKSIZE_K HEAPSIZE CODE DATAU DATAL %token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL -%token PRIVATEU PRIVATEL ALIGNCOMM +%token PRIVATEU PRIVATEL ALIGNCOMM EXCLUDE_SYMBOLS %token READ WRITE EXECUTE SHARED_K NONAMEU NONAMEL DIRECTIVE EQUAL %token <id> ID %token <digits> DIGITS @@ -155,6 +156,7 @@ command: | VERSIONK NUMBER '.' NUMBER { def_version ($2, $4);} | DIRECTIVE ID { def_directive ($2);} | ALIGNCOMM anylang_id ',' NUMBER { def_aligncomm ($2, $4);} + | EXCLUDE_SYMBOLS anylang_id { def_exclude_symbols ($2);} ; @@ -488,6 +490,15 @@ def_file_free (def_file *fdef) free (c); } + while (fdef->exclude_symbols) + { + def_file_exclude_symbol *e = fdef->exclude_symbols; + + fdef->exclude_symbols = fdef->exclude_symbols->next; + free (e->symbol_name); + free (e); + } + free (fdef); } @@ -946,6 +957,7 @@ diropts[] = { "-attr", SECTIONS }, { "-export", EXPORTS }, { "-aligncomm", ALIGNCOMM }, + { "-exclude-symbols", EXCLUDE_SYMBOLS }, { 0, 0 } }; @@ -1261,6 +1273,35 @@ def_aligncomm (char *str, int align) } } +static void +def_exclude_symbols (char *str) +{ + def_file_exclude_symbol *c, *p; + + p = NULL; + c = def->exclude_symbols; + while (c != NULL) + { + int e = strcmp (c->symbol_name, str); + if (!e) + return; + c = (p = c)->next; + } + + c = xmalloc (sizeof (def_file_exclude_symbol)); + c->symbol_name = xstrdup (str); + if (!p) + { + c->next = def->exclude_symbols; + def->exclude_symbols = c; + } + else + { + c->next = p->next; + p->next = c; + } +} + static void def_error (const char *err) { diff --git a/ld/pe-dll.c b/ld/pe-dll.c index db2c75da9b5..33be53d6164 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -718,6 +718,16 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info * } } + if (pe_def_file->exclude_symbols) + { + def_file_exclude_symbol *ac = pe_def_file->exclude_symbols; + while (ac) + { + pe_dll_add_excludes (ac->symbol_name, EXCLUDESYMS); + ac = ac->next; + } + } + /* If we are building an executable and there is nothing to export, we do not build an export table at all. */ if (bfd_link_executable (info) && pe_def_file->num_exports == 0 -- 2.25.1
- Previous message (by thread): [PATCH] [AArch64] Support AArch64 MTE memory tag dumps in core files
- Next message (by thread): [PATCH] ld: Add support for a new option, -exclude-symbols, in COFF object file directives
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list