mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-06 15:43:09 +00:00
ld: Support input section description keyword: REVERSE
PR 27565 * ldlex.l: Add REVERSE. * ldgram.y: Allow REVERSE to be used wherever a sorting command can be used. * ld.h (struct wildcard_spec): Add 'reversed' field. * ldlang.h (lang_wild_statement_struct): Add 'filenames_reversed' field. * ldlang.c (compare_sections): Add reversed parameter. (wild_sort): Reverse the comparison if requested. (print_wild_statement): Handle the reversed field. * ld.texi: Document the new feature. * NEWS: Mention the new feature. * testsuite/ld-scripts/sort-file-reversed-1.d: New test driver. * testsuite/ld-scripts/sort-file-reversed-1.t: New test source. * testsuite/ld-scripts/sort-file-reversed-2.t: New test source. * testsuite/ld-scripts/sort-file-reversed-2.d: New test driver. * testsuite/ld-scripts/sort-sections-reversed-1.d: New test driver. * testsuite/ld-scripts/sort-sections-reversed-1.t: New test source. * testsuite/ld-scripts/sort-sections-reversed-2.t: New test source. * testsuite/ld-scripts/sort-sections-reversed-2.d: New test driver. * testsuite/ld-scripts/sort-sections-reversed-3.d: New test driver. * testsuite/ld-scripts/sort-sections-reversed-3.t: New test source.
This commit is contained in:
24
ld/ChangeLog
24
ld/ChangeLog
@@ -1,3 +1,27 @@
|
|||||||
|
2023-11-01 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
PR 27565
|
||||||
|
* ldlex.l: Add REVERSE.
|
||||||
|
* ldgram.y: Allow REVERSE to be used wherever a sorting command
|
||||||
|
can be used.
|
||||||
|
* ld.h (struct wildcard_spec): Add 'reversed' field.
|
||||||
|
* ldlang.h (lang_wild_statement_struct): Add 'filenames_reversed' field.
|
||||||
|
* ldlang.c (compare_sections): Add reversed parameter.
|
||||||
|
(wild_sort): Reverse the comparison if requested.
|
||||||
|
(print_wild_statement): Handle the reversed field.
|
||||||
|
* ld.texi: Document the new feature.
|
||||||
|
* NEWS: Mention the new feature.
|
||||||
|
* testsuite/ld-scripts/sort-file-reversed-1.d: New test driver.
|
||||||
|
* testsuite/ld-scripts/sort-file-reversed-1.t: New test source.
|
||||||
|
* testsuite/ld-scripts/sort-file-reversed-2.t: New test source.
|
||||||
|
* testsuite/ld-scripts/sort-file-reversed-2.d: New test driver.
|
||||||
|
* testsuite/ld-scripts/sort-sections-reversed-1.d: New test driver.
|
||||||
|
* testsuite/ld-scripts/sort-sections-reversed-1.t: New test source.
|
||||||
|
* testsuite/ld-scripts/sort-sections-reversed-2.t: New test source.
|
||||||
|
* testsuite/ld-scripts/sort-sections-reversed-2.d: New test driver.
|
||||||
|
* testsuite/ld-scripts/sort-sections-reversed-3.d: New test driver.
|
||||||
|
* testsuite/ld-scripts/sort-sections-reversed-3.t: New test source.
|
||||||
|
|
||||||
2023-10-30 Nick Clifton <nickc@redhat.com>
|
2023-10-30 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* po/ka.po: New Georgian translation.
|
* po/ka.po: New Georgian translation.
|
||||||
|
|||||||
4
ld/NEWS
4
ld/NEWS
@@ -12,6 +12,10 @@ Changes in 2.41:
|
|||||||
* The linker command line option --print-map-locals can be used to include
|
* The linker command line option --print-map-locals can be used to include
|
||||||
local symbols in a linker map. (ELF targets only).
|
local symbols in a linker map. (ELF targets only).
|
||||||
|
|
||||||
|
* A new linker script sorting directive has been added: REVERSE. This reverses
|
||||||
|
the order of the sorting. It be combined with either SORT_BY_INIT_PRIORITY
|
||||||
|
or SORT_BY_NAME.
|
||||||
|
|
||||||
* For most ELF based targets, if the --enable-linker-version option is used
|
* For most ELF based targets, if the --enable-linker-version option is used
|
||||||
then the version of the linker will be inserted as a string into the .comment
|
then the version of the linker will be inserted as a string into the .comment
|
||||||
section.
|
section.
|
||||||
|
|||||||
13
ld/ld.h
13
ld/ld.h
@@ -96,11 +96,14 @@ extern sort_type sort_section;
|
|||||||
|
|
||||||
struct wildcard_spec
|
struct wildcard_spec
|
||||||
{
|
{
|
||||||
const char *name;
|
const char * name;
|
||||||
struct name_list *exclude_name_list;
|
struct name_list * exclude_name_list;
|
||||||
struct flag_info *section_flag_list;
|
struct flag_info * section_flag_list;
|
||||||
size_t namelen, prefixlen, suffixlen;
|
size_t namelen;
|
||||||
sort_type sorted;
|
size_t prefixlen;
|
||||||
|
size_t suffixlen;
|
||||||
|
sort_type sorted;
|
||||||
|
bool reversed;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wildcard_list
|
struct wildcard_list
|
||||||
|
|||||||
38
ld/ld.texi
38
ld/ld.texi
@@ -5263,6 +5263,35 @@ the init_priority. In @code{.ctors.NNNNN} and @code{.dtors.NNNNN},
|
|||||||
@cindex SORT
|
@cindex SORT
|
||||||
@code{SORT} is an alias for @code{SORT_BY_NAME}.
|
@code{SORT} is an alias for @code{SORT_BY_NAME}.
|
||||||
|
|
||||||
|
@cindex REVERSE
|
||||||
|
@code{REVERSE} indicates that the sorting should be reversed. If used
|
||||||
|
on its own then @code{REVERSE} implies @code{SORT_BY_NAME}, otherwise
|
||||||
|
it reverses the enclosed @code{SORT..} command. Note - reverse
|
||||||
|
sorting of alignment is not currently supported.
|
||||||
|
|
||||||
|
Note - the sorting commands only accept a single wildcard pattern. So
|
||||||
|
for example the following will not work:
|
||||||
|
@smallexample
|
||||||
|
*(REVERSE(.text* .init*))
|
||||||
|
@end smallexample
|
||||||
|
To resolve this problem list the patterns individually, like this:
|
||||||
|
@smallexample
|
||||||
|
*(REVERSE(.text*))
|
||||||
|
*(REVERSE(.init*))
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
|
Note - you can put the @code{EXCLUDE_FILE} command inside a sorting
|
||||||
|
command, but not the other way around. So for example:
|
||||||
|
@smallexample
|
||||||
|
*(SORT_BY_NAME(EXCLUDE_FILE(foo) .text*))
|
||||||
|
@end smallexample
|
||||||
|
will work, but:
|
||||||
|
@smallexample
|
||||||
|
*(EXCLUDE_FILE(foo) SORT_BY_NAME(.text*))
|
||||||
|
@end smallexample
|
||||||
|
will not.
|
||||||
|
|
||||||
|
|
||||||
When there are nested section sorting commands in linker script, there
|
When there are nested section sorting commands in linker script, there
|
||||||
can be at most 1 level of nesting for section sorting commands.
|
can be at most 1 level of nesting for section sorting commands.
|
||||||
|
|
||||||
@@ -5282,6 +5311,15 @@ treated the same as @code{SORT_BY_NAME} (wildcard section pattern).
|
|||||||
@code{SORT_BY_ALIGNMENT} (@code{SORT_BY_ALIGNMENT} (wildcard section pattern))
|
@code{SORT_BY_ALIGNMENT} (@code{SORT_BY_ALIGNMENT} (wildcard section pattern))
|
||||||
is treated the same as @code{SORT_BY_ALIGNMENT} (wildcard section pattern).
|
is treated the same as @code{SORT_BY_ALIGNMENT} (wildcard section pattern).
|
||||||
@item
|
@item
|
||||||
|
@code{SORT_BY_NAME} (@code{REVERSE} (wildcard section pattern))
|
||||||
|
reverse sorts by name.
|
||||||
|
@item
|
||||||
|
@code{REVERSE} (@code{SORT_BY_NAME} (wildcard section pattern))
|
||||||
|
reverse sorts by name.
|
||||||
|
@item
|
||||||
|
@code{SORT_BY_INIT_PRIORITY} (@code{REVERSE} (wildcard section pattern))
|
||||||
|
reverse sorts by init priority.
|
||||||
|
@item
|
||||||
All other nested section sorting commands are invalid.
|
All other nested section sorting commands are invalid.
|
||||||
@end enumerate
|
@end enumerate
|
||||||
|
|
||||||
|
|||||||
59
ld/ldgram.y
59
ld/ldgram.y
@@ -102,7 +102,7 @@ static void yyerror (const char *);
|
|||||||
%type <flag_info> sect_flags
|
%type <flag_info> sect_flags
|
||||||
%type <name> memspec_opt memspec_at_opt paren_script_name casesymlist
|
%type <name> memspec_opt memspec_at_opt paren_script_name casesymlist
|
||||||
%type <cname> wildcard_name
|
%type <cname> wildcard_name
|
||||||
%type <wildcard> section_name_spec filename_spec wildcard_maybe_exclude
|
%type <wildcard> section_name_spec filename_spec wildcard_maybe_exclude wildcard_maybe_reverse
|
||||||
%token <bigint> INT
|
%token <bigint> INT
|
||||||
%token <name> NAME LNAME
|
%token <name> NAME LNAME
|
||||||
%type <integer> length
|
%type <integer> length
|
||||||
@@ -132,7 +132,7 @@ static void yyerror (const char *);
|
|||||||
%token SECTIONS PHDRS INSERT_K AFTER BEFORE LINKER_VERSION
|
%token SECTIONS PHDRS INSERT_K AFTER BEFORE LINKER_VERSION
|
||||||
%token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
|
%token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
|
||||||
%token SORT_BY_NAME SORT_BY_ALIGNMENT SORT_NONE
|
%token SORT_BY_NAME SORT_BY_ALIGNMENT SORT_NONE
|
||||||
%token SORT_BY_INIT_PRIORITY
|
%token SORT_BY_INIT_PRIORITY REVERSE
|
||||||
%token '{' '}'
|
%token '{' '}'
|
||||||
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
|
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
|
||||||
%token INHIBIT_COMMON_ALLOCATION FORCE_GROUP_ALLOCATION
|
%token INHIBIT_COMMON_ALLOCATION FORCE_GROUP_ALLOCATION
|
||||||
@@ -440,6 +440,7 @@ wildcard_maybe_exclude:
|
|||||||
$$.sorted = none;
|
$$.sorted = none;
|
||||||
$$.exclude_name_list = NULL;
|
$$.exclude_name_list = NULL;
|
||||||
$$.section_flag_list = NULL;
|
$$.section_flag_list = NULL;
|
||||||
|
$$.reversed = false;
|
||||||
}
|
}
|
||||||
| EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
|
| EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
|
||||||
{
|
{
|
||||||
@@ -447,65 +448,95 @@ wildcard_maybe_exclude:
|
|||||||
$$.sorted = none;
|
$$.sorted = none;
|
||||||
$$.exclude_name_list = $3;
|
$$.exclude_name_list = $3;
|
||||||
$$.section_flag_list = NULL;
|
$$.section_flag_list = NULL;
|
||||||
|
$$.reversed = false;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
wildcard_maybe_reverse:
|
||||||
|
wildcard_maybe_exclude
|
||||||
|
| REVERSE '(' wildcard_maybe_exclude ')'
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
$$.reversed = true;
|
||||||
|
$$.sorted = by_name;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
filename_spec:
|
filename_spec:
|
||||||
wildcard_maybe_exclude
|
wildcard_maybe_reverse
|
||||||
| SORT_BY_NAME '(' wildcard_maybe_exclude ')'
|
| SORT_BY_NAME '(' wildcard_maybe_reverse ')'
|
||||||
{
|
{
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
$$.sorted = by_name;
|
$$.sorted = by_name;
|
||||||
}
|
}
|
||||||
| SORT_NONE '(' wildcard_maybe_exclude ')'
|
| SORT_NONE '(' wildcard_maybe_reverse ')'
|
||||||
{
|
{
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
$$.sorted = by_none;
|
$$.sorted = by_none;
|
||||||
|
$$.reversed = false;
|
||||||
|
}
|
||||||
|
| REVERSE '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
|
||||||
|
{
|
||||||
|
$$ = $5;
|
||||||
|
$$.sorted = by_name;
|
||||||
|
$$.reversed = true;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
section_name_spec:
|
section_name_spec:
|
||||||
wildcard_maybe_exclude
|
wildcard_maybe_reverse
|
||||||
| SORT_BY_NAME '(' wildcard_maybe_exclude ')'
|
| SORT_BY_NAME '(' wildcard_maybe_reverse ')'
|
||||||
{
|
{
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
$$.sorted = by_name;
|
$$.sorted = by_name;
|
||||||
}
|
}
|
||||||
| SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')'
|
| SORT_BY_ALIGNMENT '(' wildcard_maybe_reverse ')'
|
||||||
{
|
{
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
$$.sorted = by_alignment;
|
$$.sorted = by_alignment;
|
||||||
}
|
}
|
||||||
| SORT_NONE '(' wildcard_maybe_exclude ')'
|
| SORT_NONE '(' wildcard_maybe_reverse ')'
|
||||||
{
|
{
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
$$.sorted = by_none;
|
$$.sorted = by_none;
|
||||||
}
|
}
|
||||||
| SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')'
|
| SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_reverse ')' ')'
|
||||||
{
|
{
|
||||||
$$ = $5;
|
$$ = $5;
|
||||||
$$.sorted = by_name_alignment;
|
$$.sorted = by_name_alignment;
|
||||||
}
|
}
|
||||||
| SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
|
| SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_maybe_reverse ')' ')'
|
||||||
{
|
{
|
||||||
$$ = $5;
|
$$ = $5;
|
||||||
$$.sorted = by_name;
|
$$.sorted = by_name;
|
||||||
}
|
}
|
||||||
| SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
|
| SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_maybe_reverse ')' ')'
|
||||||
{
|
{
|
||||||
$$ = $5;
|
$$ = $5;
|
||||||
$$.sorted = by_alignment_name;
|
$$.sorted = by_alignment_name;
|
||||||
}
|
}
|
||||||
| SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')'
|
| SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_reverse ')' ')'
|
||||||
{
|
{
|
||||||
$$ = $5;
|
$$ = $5;
|
||||||
$$.sorted = by_alignment;
|
$$.sorted = by_alignment;
|
||||||
}
|
}
|
||||||
| SORT_BY_INIT_PRIORITY '(' wildcard_maybe_exclude ')'
|
| SORT_BY_INIT_PRIORITY '(' wildcard_maybe_reverse ')'
|
||||||
{
|
{
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
$$.sorted = by_init_priority;
|
$$.sorted = by_init_priority;
|
||||||
}
|
}
|
||||||
|
| REVERSE '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
|
||||||
|
{
|
||||||
|
$$ = $5;
|
||||||
|
$$.sorted = by_name;
|
||||||
|
$$.reversed = true;
|
||||||
|
}
|
||||||
|
| REVERSE '(' SORT_BY_INIT_PRIORITY '(' wildcard_maybe_exclude ')' ')'
|
||||||
|
{
|
||||||
|
$$ = $5;
|
||||||
|
$$.sorted = by_init_priority;
|
||||||
|
$$.reversed = true;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
sect_flag_list: NAME
|
sect_flag_list: NAME
|
||||||
|
|||||||
44
ld/ldlang.c
44
ld/ldlang.c
@@ -539,7 +539,7 @@ get_init_priority (const asection *sec)
|
|||||||
/* Compare sections ASEC and BSEC according to SORT. */
|
/* Compare sections ASEC and BSEC according to SORT. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
compare_section (sort_type sort, asection *asec, asection *bsec)
|
compare_section (sort_type sort, asection *asec, asection *bsec, bool reversed)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int a_priority, b_priority;
|
int a_priority, b_priority;
|
||||||
@@ -554,7 +554,10 @@ compare_section (sort_type sort, asection *asec, asection *bsec)
|
|||||||
b_priority = get_init_priority (bsec);
|
b_priority = get_init_priority (bsec);
|
||||||
if (a_priority < 0 || b_priority < 0)
|
if (a_priority < 0 || b_priority < 0)
|
||||||
goto sort_by_name;
|
goto sort_by_name;
|
||||||
ret = a_priority - b_priority;
|
if (reversed)
|
||||||
|
ret = b_priority - a_priority;
|
||||||
|
else
|
||||||
|
ret = a_priority - b_priority;
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
break;
|
||||||
else
|
else
|
||||||
@@ -568,11 +571,17 @@ compare_section (sort_type sort, asection *asec, asection *bsec)
|
|||||||
|
|
||||||
case by_name:
|
case by_name:
|
||||||
sort_by_name:
|
sort_by_name:
|
||||||
ret = strcmp (bfd_section_name (asec), bfd_section_name (bsec));
|
if (reversed)
|
||||||
|
ret = strcmp (bfd_section_name (bsec), bfd_section_name (asec));
|
||||||
|
else
|
||||||
|
ret = strcmp (bfd_section_name (asec), bfd_section_name (bsec));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case by_name_alignment:
|
case by_name_alignment:
|
||||||
ret = strcmp (bfd_section_name (asec), bfd_section_name (bsec));
|
if (reversed)
|
||||||
|
ret = strcmp (bfd_section_name (bsec), bfd_section_name (asec));
|
||||||
|
else
|
||||||
|
ret = strcmp (bfd_section_name (asec), bfd_section_name (bsec));
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
break;
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
@@ -647,7 +656,11 @@ wild_sort (lang_wild_statement_type *wild,
|
|||||||
else
|
else
|
||||||
ln = sort_filename (lsec->owner);
|
ln = sort_filename (lsec->owner);
|
||||||
|
|
||||||
i = filename_cmp (fn, ln);
|
if (wild->filenames_reversed)
|
||||||
|
i = filename_cmp (ln, fn);
|
||||||
|
else
|
||||||
|
i = filename_cmp (fn, ln);
|
||||||
|
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{ tree = &((*tree)->right); continue; }
|
{ tree = &((*tree)->right); continue; }
|
||||||
else if (i < 0)
|
else if (i < 0)
|
||||||
@@ -660,7 +673,11 @@ wild_sort (lang_wild_statement_type *wild,
|
|||||||
if (la)
|
if (la)
|
||||||
ln = sort_filename (lsec->owner);
|
ln = sort_filename (lsec->owner);
|
||||||
|
|
||||||
i = filename_cmp (fn, ln);
|
if (wild->filenames_reversed)
|
||||||
|
i = filename_cmp (ln, fn);
|
||||||
|
else
|
||||||
|
i = filename_cmp (fn, ln);
|
||||||
|
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{ tree = &((*tree)->right); continue; }
|
{ tree = &((*tree)->right); continue; }
|
||||||
else if (i < 0)
|
else if (i < 0)
|
||||||
@@ -673,7 +690,7 @@ wild_sort (lang_wild_statement_type *wild,
|
|||||||
|
|
||||||
/* Find the correct node to append this section. */
|
/* Find the correct node to append this section. */
|
||||||
if (sec && sec->spec.sorted != none && sec->spec.sorted != by_none
|
if (sec && sec->spec.sorted != none && sec->spec.sorted != by_none
|
||||||
&& compare_section (sec->spec.sorted, section, (*tree)->section) < 0)
|
&& compare_section (sec->spec.sorted, section, (*tree)->section, sec->spec.reversed) < 0)
|
||||||
tree = &((*tree)->left);
|
tree = &((*tree)->left);
|
||||||
else
|
else
|
||||||
tree = &((*tree)->right);
|
tree = &((*tree)->right);
|
||||||
@@ -5151,10 +5168,14 @@ print_wild_statement (lang_wild_statement_type *w,
|
|||||||
|
|
||||||
if (w->filenames_sorted)
|
if (w->filenames_sorted)
|
||||||
minfo ("SORT_BY_NAME(");
|
minfo ("SORT_BY_NAME(");
|
||||||
|
if (w->filenames_reversed)
|
||||||
|
minfo ("REVERSE(");
|
||||||
if (w->filename != NULL)
|
if (w->filename != NULL)
|
||||||
minfo ("%s", w->filename);
|
minfo ("%s", w->filename);
|
||||||
else
|
else
|
||||||
minfo ("*");
|
minfo ("*");
|
||||||
|
if (w->filenames_reversed)
|
||||||
|
minfo (")");
|
||||||
if (w->filenames_sorted)
|
if (w->filenames_sorted)
|
||||||
minfo (")");
|
minfo (")");
|
||||||
|
|
||||||
@@ -5199,6 +5220,12 @@ print_wild_statement (lang_wild_statement_type *w,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sec->spec.reversed)
|
||||||
|
{
|
||||||
|
minfo ("REVERSE(");
|
||||||
|
closing_paren++;
|
||||||
|
}
|
||||||
|
|
||||||
if (sec->spec.exclude_name_list != NULL)
|
if (sec->spec.exclude_name_list != NULL)
|
||||||
{
|
{
|
||||||
name_list *tmp;
|
name_list *tmp;
|
||||||
@@ -8500,9 +8527,10 @@ lang_add_wild (struct wildcard_spec *filespec,
|
|||||||
if (filespec != NULL)
|
if (filespec != NULL)
|
||||||
{
|
{
|
||||||
new_stmt->filename = filespec->name;
|
new_stmt->filename = filespec->name;
|
||||||
new_stmt->filenames_sorted = filespec->sorted == by_name;
|
new_stmt->filenames_sorted = (filespec->sorted == by_name || filespec->reversed);
|
||||||
new_stmt->section_flag_list = filespec->section_flag_list;
|
new_stmt->section_flag_list = filespec->section_flag_list;
|
||||||
new_stmt->exclude_name_list = filespec->exclude_name_list;
|
new_stmt->exclude_name_list = filespec->exclude_name_list;
|
||||||
|
new_stmt->filenames_reversed = filespec->reversed;
|
||||||
}
|
}
|
||||||
new_stmt->section_list = section_list;
|
new_stmt->section_list = section_list;
|
||||||
new_stmt->keep_sections = keep_sections;
|
new_stmt->keep_sections = keep_sections;
|
||||||
|
|||||||
25
ld/ldlang.h
25
ld/ldlang.h
@@ -390,18 +390,19 @@ typedef struct lang_section_bst
|
|||||||
|
|
||||||
struct lang_wild_statement_struct
|
struct lang_wild_statement_struct
|
||||||
{
|
{
|
||||||
lang_statement_header_type header;
|
lang_statement_header_type header;
|
||||||
const char *filename;
|
lang_statement_list_type children;
|
||||||
bool filenames_sorted;
|
lang_statement_list_type matching_sections;
|
||||||
bool any_specs_sorted;
|
lang_section_bst_type * tree;
|
||||||
struct wildcard_list *section_list;
|
lang_section_bst_type ** rightmost;
|
||||||
bool keep_sections;
|
struct wildcard_list * section_list;
|
||||||
lang_statement_list_type children;
|
struct name_list * exclude_name_list;
|
||||||
struct name_list *exclude_name_list;
|
struct flag_info * section_flag_list;
|
||||||
lang_statement_list_type matching_sections;
|
const char * filename;
|
||||||
|
bool filenames_sorted;
|
||||||
lang_section_bst_type *tree, **rightmost;
|
bool filenames_reversed;
|
||||||
struct flag_info *section_flag_list;
|
bool any_specs_sorted;
|
||||||
|
bool keep_sections;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct lang_address_statement_struct
|
typedef struct lang_address_statement_struct
|
||||||
|
|||||||
@@ -322,6 +322,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
|
|||||||
<WILD>"SORT" { RTOKEN(SORT_BY_NAME); }
|
<WILD>"SORT" { RTOKEN(SORT_BY_NAME); }
|
||||||
<WILD>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
|
<WILD>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
|
||||||
<WILD>"SORT_NONE" { RTOKEN(SORT_NONE); }
|
<WILD>"SORT_NONE" { RTOKEN(SORT_NONE); }
|
||||||
|
<WILD>"REVERSE" { RTOKEN(REVERSE); }
|
||||||
<EXPRESSION>"NOLOAD" { RTOKEN(NOLOAD); }
|
<EXPRESSION>"NOLOAD" { RTOKEN(NOLOAD); }
|
||||||
<EXPRESSION>"READONLY" { RTOKEN(READONLY); }
|
<EXPRESSION>"READONLY" { RTOKEN(READONLY); }
|
||||||
<EXPRESSION>"DSECT" { RTOKEN(DSECT); }
|
<EXPRESSION>"DSECT" { RTOKEN(DSECT); }
|
||||||
|
|||||||
18
ld/testsuite/ld-scripts/sort-file-reversed-1.d
Normal file
18
ld/testsuite/ld-scripts/sort-file-reversed-1.d
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#source: sort-file1.s
|
||||||
|
#source: sort-file2.s
|
||||||
|
#ld: -T sort-file-reversed-1.t --no-warn-rwx-segments
|
||||||
|
#nm: -n
|
||||||
|
|
||||||
|
# Check that SORT_BY_NAME+REVERSE on filenames works.
|
||||||
|
# The text sections should come in reversed sorted order, the data
|
||||||
|
# sections in input order. Note how we specifically pass
|
||||||
|
# the object filenames in alphabetical order
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t infile2
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t infile1
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* d data1
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* d data2
|
||||||
|
#pass
|
||||||
6
ld/testsuite/ld-scripts/sort-file-reversed-1.t
Normal file
6
ld/testsuite/ld-scripts/sort-file-reversed-1.t
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text : { SORT_BY_NAME(REVERSE(*))(.text*) }
|
||||||
|
.data : { *(.data*) }
|
||||||
|
/DISCARD/ : { *(.*) }
|
||||||
|
}
|
||||||
19
ld/testsuite/ld-scripts/sort-file-reversed-2.d
Normal file
19
ld/testsuite/ld-scripts/sort-file-reversed-2.d
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#source: sort-file1.s
|
||||||
|
#source: sort-file2.s
|
||||||
|
#ld: -T sort-file-reversed-2.t --no-warn-rwx-segments
|
||||||
|
#nm: -n
|
||||||
|
|
||||||
|
# Check that REVERSE+SORT_BY_NAME on filenames works.
|
||||||
|
# Also check that REVERSE implies SORT_BY_NAME.
|
||||||
|
# The text sections should come in reversed sorted order, the data
|
||||||
|
# sections in reversed order too. Note how we specifically pass
|
||||||
|
# the object filenames in alphabetical order
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t infile2
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t infile1
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* d data2
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* d data1
|
||||||
|
#pass
|
||||||
6
ld/testsuite/ld-scripts/sort-file-reversed-2.t
Normal file
6
ld/testsuite/ld-scripts/sort-file-reversed-2.t
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text : { REVERSE(SORT_BY_NAME(*))(.text*) }
|
||||||
|
.data : { REVERSE(*)(.data*) }
|
||||||
|
/DISCARD/ : { *(.*) }
|
||||||
|
}
|
||||||
13
ld/testsuite/ld-scripts/sort-sections-reversed-1.d
Normal file
13
ld/testsuite/ld-scripts/sort-sections-reversed-1.d
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#source: sort_b_a.s
|
||||||
|
#ld: -T sort-sections-reversed-1.t --no-warn-rwx-segments
|
||||||
|
#nm: -n
|
||||||
|
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text3
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text2
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text1
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text
|
||||||
|
#pass
|
||||||
5
ld/testsuite/ld-scripts/sort-sections-reversed-1.t
Normal file
5
ld/testsuite/ld-scripts/sort-sections-reversed-1.t
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text : { *(SORT_BY_NAME(REVERSE(.text*))) }
|
||||||
|
/DISCARD/ : { *(.*) }
|
||||||
|
}
|
||||||
13
ld/testsuite/ld-scripts/sort-sections-reversed-2.d
Normal file
13
ld/testsuite/ld-scripts/sort-sections-reversed-2.d
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#source: sort_b_a.s
|
||||||
|
#ld: -T sort-sections-reversed-2.t --no-warn-rwx-segments
|
||||||
|
#nm: -n
|
||||||
|
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text3
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text2
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text1
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text
|
||||||
|
#pass
|
||||||
5
ld/testsuite/ld-scripts/sort-sections-reversed-2.t
Normal file
5
ld/testsuite/ld-scripts/sort-sections-reversed-2.t
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text : { *(REVERSE(SORT_BY_INIT_PRIORITY(.text*))) }
|
||||||
|
/DISCARD/ : { *(REVERSE(.*)) }
|
||||||
|
}
|
||||||
15
ld/testsuite/ld-scripts/sort-sections-reversed-3.d
Normal file
15
ld/testsuite/ld-scripts/sort-sections-reversed-3.d
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#source: sort_b_a.s
|
||||||
|
#ld: -T sort-sections-reversed-3.t --no-warn-rwx-segments
|
||||||
|
#nm: -n
|
||||||
|
|
||||||
|
# Check that REVERSE implies SORT_BY_NAME for sections.
|
||||||
|
# Also check that EXCLUDE_FILE() is supported inside REVERSE.
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text3
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text2
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text1
|
||||||
|
#...
|
||||||
|
0[0-9a-f]* t text
|
||||||
|
#pass
|
||||||
5
ld/testsuite/ld-scripts/sort-sections-reversed-3.t
Normal file
5
ld/testsuite/ld-scripts/sort-sections-reversed-3.t
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text : { *(REVERSE(EXCLUDE_FILE(foo) .text*)) }
|
||||||
|
/DISCARD/ : { *(.*) }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user