Add SORT_NONE and don't sort sort .init/.fini sections
ld/ PR ld/14156 * NEWS: Mention SORT_NONE. * ld.h (sort_type): Add by_none. * ld.texinfo: Document SORT_NONE. * ldgram.y: Handle SORT_NONE. * ldlang.c (update_wild_statements): Handle by_none. Don't sort .init/.fini sections. * ldlex.l: Add SORT_NONE. ld/testsuite/ PR ld/14156 * ld-elf/fini0.s: New file. * ld-elf/fini1.s: Likewise. * ld-elf/fini2.s: Likewise. * ld-elf/fini3.s: Likewise. * ld-elf/finin.s: Likewise. * ld-elf/foo0.s: Likewise. * ld-elf/foo1.s: Likewise. * ld-elf/foo2.s: Likewise. * ld-elf/foo3.s: Likewise. * ld-elf/foon.s: Likewise. * ld-elf/init0.s: Likewise. * ld-elf/init1.s: Likewise. * ld-elf/init2.s: Likewise. * ld-elf/init3.s: Likewise. * ld-elf/initn.s: Likewise. * ld-elf/pr14156a.d: Likewise. * ld-elf/pr14156b.d: Likewise. * ld-elf/pr14156c.d: Likewise. * ld-elf/pr14156c.t: Likewise.
This commit is contained in:
parent
bc9ad2e430
commit
eda680f805
16
ld/ChangeLog
16
ld/ChangeLog
@ -1,3 +1,19 @@
|
|||||||
|
2012-07-10 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
PR ld/14156
|
||||||
|
* NEWS: Mention SORT_NONE.
|
||||||
|
|
||||||
|
* ld.h (sort_type): Add by_none.
|
||||||
|
|
||||||
|
* ld.texinfo: Document SORT_NONE.
|
||||||
|
|
||||||
|
* ldgram.y: Handle SORT_NONE.
|
||||||
|
|
||||||
|
* ldlang.c (update_wild_statements): Handle by_none. Don't
|
||||||
|
sort .init/.fini sections.
|
||||||
|
|
||||||
|
* ldlex.l: Add SORT_NONE.
|
||||||
|
|
||||||
2012-07-02 H.J. Lu <hongjiu.lu@intel.com>
|
2012-07-02 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* ld.texinfo: Replace __end_SECNAME with __stop_SECNAME.
|
* ld.texinfo: Replace __end_SECNAME with __stop_SECNAME.
|
||||||
|
2
ld/NEWS
2
ld/NEWS
@ -1,5 +1,7 @@
|
|||||||
-*- text -*-
|
-*- text -*-
|
||||||
|
|
||||||
|
* Added SORT_NONE to the linker script language to disable section sorting.
|
||||||
|
|
||||||
* Add a linker-provided symbol when producing ELF output, '__ehdr_start'
|
* Add a linker-provided symbol when producing ELF output, '__ehdr_start'
|
||||||
to point to the ELF file header (and nearby program headers) in the
|
to point to the ELF file header (and nearby program headers) in the
|
||||||
program's memory image.
|
program's memory image.
|
||||||
|
2
ld/ld.h
2
ld/ld.h
@ -87,7 +87,7 @@ typedef enum {sort_none, sort_ascending, sort_descending} sort_order;
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
none, by_name, by_alignment, by_name_alignment, by_alignment_name,
|
none, by_name, by_alignment, by_name_alignment, by_alignment_name,
|
||||||
by_init_priority
|
by_none, by_init_priority
|
||||||
} sort_type;
|
} sort_type;
|
||||||
|
|
||||||
extern sort_type sort_section;
|
extern sort_type sort_section;
|
||||||
|
@ -4038,6 +4038,10 @@ treated as nested sorting command.
|
|||||||
If the section sorting command in linker script is nested, the
|
If the section sorting command in linker script is nested, the
|
||||||
command line option will be ignored.
|
command line option will be ignored.
|
||||||
|
|
||||||
|
@cindex SORT_NONE
|
||||||
|
@code{SORT_NONE} disables section sorting by ignoring the command line
|
||||||
|
section sorting option.
|
||||||
|
|
||||||
If you ever get confused about where input sections are going, use the
|
If you ever get confused about where input sections are going, use the
|
||||||
@samp{-M} linker option to generate a map file. The map file shows
|
@samp{-M} linker option to generate a map file. The map file shows
|
||||||
precisely how input sections are mapped to output sections.
|
precisely how input sections are mapped to output sections.
|
||||||
|
@ -129,7 +129,7 @@ static int error_index;
|
|||||||
%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
|
%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
|
||||||
%token SECTIONS PHDRS INSERT_K AFTER BEFORE
|
%token SECTIONS PHDRS INSERT_K AFTER BEFORE
|
||||||
%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
|
%token SORT_BY_NAME SORT_BY_ALIGNMENT SORT_NONE
|
||||||
%token SORT_BY_INIT_PRIORITY
|
%token SORT_BY_INIT_PRIORITY
|
||||||
%token '{' '}'
|
%token '{' '}'
|
||||||
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
|
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
|
||||||
@ -467,6 +467,13 @@ wildcard_spec:
|
|||||||
$$.exclude_name_list = NULL;
|
$$.exclude_name_list = NULL;
|
||||||
$$.section_flag_list = NULL;
|
$$.section_flag_list = NULL;
|
||||||
}
|
}
|
||||||
|
| SORT_NONE '(' wildcard_name ')'
|
||||||
|
{
|
||||||
|
$$.name = $3;
|
||||||
|
$$.sorted = by_none;
|
||||||
|
$$.exclude_name_list = NULL;
|
||||||
|
$$.section_flag_list = NULL;
|
||||||
|
}
|
||||||
| SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
|
| SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_name ')' ')'
|
||||||
{
|
{
|
||||||
$$.name = $5;
|
$$.name = $5;
|
||||||
|
@ -3510,6 +3510,8 @@ update_wild_statements (lang_statement_union_type *s)
|
|||||||
if (sort_section == by_name)
|
if (sort_section == by_name)
|
||||||
sec->spec.sorted = by_alignment_name;
|
sec->spec.sorted = by_alignment_name;
|
||||||
break;
|
break;
|
||||||
|
case by_none:
|
||||||
|
sec->spec.sorted = none;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3521,8 +3523,11 @@ update_wild_statements (lang_statement_union_type *s)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case lang_output_section_statement_enum:
|
case lang_output_section_statement_enum:
|
||||||
update_wild_statements
|
/* Don't sort .init/.fini sections. */
|
||||||
(s->output_section_statement.children.head);
|
if (strcmp (s->output_section_statement.name, ".init") != 0
|
||||||
|
&& strcmp (s->output_section_statement.name, ".fini") != 0)
|
||||||
|
update_wild_statements
|
||||||
|
(s->output_section_statement.children.head);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case lang_group_statement_enum:
|
case lang_group_statement_enum:
|
||||||
|
@ -302,6 +302,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
|
|||||||
<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
|
<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
|
||||||
<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
|
<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
|
||||||
<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
|
<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
|
||||||
|
<BOTH,SCRIPT>"SORT_NONE" { RTOKEN(SORT_NONE); }
|
||||||
<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
|
<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
|
||||||
<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
|
<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
|
||||||
<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
|
<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
|
||||||
|
@ -1,3 +1,26 @@
|
|||||||
|
2012-07-10 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
PR ld/14156
|
||||||
|
* ld-elf/fini0.s: New file.
|
||||||
|
* ld-elf/fini1.s: Likewise.
|
||||||
|
* ld-elf/fini2.s: Likewise.
|
||||||
|
* ld-elf/fini3.s: Likewise.
|
||||||
|
* ld-elf/finin.s: Likewise.
|
||||||
|
* ld-elf/foo0.s: Likewise.
|
||||||
|
* ld-elf/foo1.s: Likewise.
|
||||||
|
* ld-elf/foo2.s: Likewise.
|
||||||
|
* ld-elf/foo3.s: Likewise.
|
||||||
|
* ld-elf/foon.s: Likewise.
|
||||||
|
* ld-elf/init0.s: Likewise.
|
||||||
|
* ld-elf/init1.s: Likewise.
|
||||||
|
* ld-elf/init2.s: Likewise.
|
||||||
|
* ld-elf/init3.s: Likewise.
|
||||||
|
* ld-elf/initn.s: Likewise.
|
||||||
|
* ld-elf/pr14156a.d: Likewise.
|
||||||
|
* ld-elf/pr14156b.d: Likewise.
|
||||||
|
* ld-elf/pr14156c.d: Likewise.
|
||||||
|
* ld-elf/pr14156c.t: Likewise.
|
||||||
|
|
||||||
2012-07-09 H.J. Lu <hongjiu.lu@intel.com>
|
2012-07-09 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR ld/14323
|
PR ld/14323
|
||||||
|
16
ld/testsuite/ld-elf/fini0.s
Normal file
16
ld/testsuite/ld-elf/fini0.s
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
.text
|
||||||
|
.global start /* Used by SH targets. */
|
||||||
|
start:
|
||||||
|
.global _start
|
||||||
|
_start:
|
||||||
|
.global __start
|
||||||
|
__start:
|
||||||
|
.global main /* Used by HPPA targets. */
|
||||||
|
main:
|
||||||
|
.dc.a 0
|
||||||
|
|
||||||
|
.section .fini
|
||||||
|
.p2align 2
|
||||||
|
.globl foo
|
||||||
|
.type foo,%function
|
||||||
|
foo:
|
6
ld/testsuite/ld-elf/fini1.s
Normal file
6
ld/testsuite/ld-elf/fini1.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .fini
|
||||||
|
.p2align 2
|
||||||
|
.type foo1,%function
|
||||||
|
foo1:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo1,.-foo1
|
6
ld/testsuite/ld-elf/fini2.s
Normal file
6
ld/testsuite/ld-elf/fini2.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .fini
|
||||||
|
.p2align 6
|
||||||
|
.type foo2,%function
|
||||||
|
foo2:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo2,.-foo2
|
6
ld/testsuite/ld-elf/fini3.s
Normal file
6
ld/testsuite/ld-elf/fini3.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .fini
|
||||||
|
.p2align 4
|
||||||
|
.type foo3,%function
|
||||||
|
foo3:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo3,.-foo3
|
6
ld/testsuite/ld-elf/finin.s
Normal file
6
ld/testsuite/ld-elf/finin.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .fini
|
||||||
|
.p2align 8
|
||||||
|
.type last,%function
|
||||||
|
last:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size last,.-last
|
16
ld/testsuite/ld-elf/foo0.s
Normal file
16
ld/testsuite/ld-elf/foo0.s
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
.text
|
||||||
|
.global start /* Used by SH targets. */
|
||||||
|
start:
|
||||||
|
.global _start
|
||||||
|
_start:
|
||||||
|
.global __start
|
||||||
|
__start:
|
||||||
|
.global main /* Used by HPPA targets. */
|
||||||
|
main:
|
||||||
|
.dc.a 0
|
||||||
|
|
||||||
|
.section .foo,"ax",@progbits
|
||||||
|
.p2align 2
|
||||||
|
.globl foo
|
||||||
|
.type foo,%function
|
||||||
|
foo:
|
6
ld/testsuite/ld-elf/foo1.s
Normal file
6
ld/testsuite/ld-elf/foo1.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .foo,"ax",@progbits
|
||||||
|
.p2align 2
|
||||||
|
.type foo1,%function
|
||||||
|
foo1:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo1,.-foo1
|
6
ld/testsuite/ld-elf/foo2.s
Normal file
6
ld/testsuite/ld-elf/foo2.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .foo,"ax",@progbits
|
||||||
|
.p2align 6
|
||||||
|
.type foo2,%function
|
||||||
|
foo2:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo2,.-foo2
|
6
ld/testsuite/ld-elf/foo3.s
Normal file
6
ld/testsuite/ld-elf/foo3.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .foo,"ax",@progbits
|
||||||
|
.p2align 4
|
||||||
|
.type foo3,%function
|
||||||
|
foo3:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo3,.-foo3
|
6
ld/testsuite/ld-elf/foon.s
Normal file
6
ld/testsuite/ld-elf/foon.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .foo,"ax",@progbits
|
||||||
|
.p2align 8
|
||||||
|
.type last,%function
|
||||||
|
last:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size last,.-last
|
16
ld/testsuite/ld-elf/init0.s
Normal file
16
ld/testsuite/ld-elf/init0.s
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
.text
|
||||||
|
.global start /* Used by SH targets. */
|
||||||
|
start:
|
||||||
|
.global _start
|
||||||
|
_start:
|
||||||
|
.global __start
|
||||||
|
__start:
|
||||||
|
.global main /* Used by HPPA targets. */
|
||||||
|
main:
|
||||||
|
.dc.a 0
|
||||||
|
|
||||||
|
.section .init
|
||||||
|
.p2align 2
|
||||||
|
.globl foo
|
||||||
|
.type foo,%function
|
||||||
|
foo:
|
6
ld/testsuite/ld-elf/init1.s
Normal file
6
ld/testsuite/ld-elf/init1.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .init
|
||||||
|
.p2align 2
|
||||||
|
.type foo1,%function
|
||||||
|
foo1:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo1,.-foo1
|
6
ld/testsuite/ld-elf/init2.s
Normal file
6
ld/testsuite/ld-elf/init2.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .init
|
||||||
|
.p2align 6
|
||||||
|
.type foo2,%function
|
||||||
|
foo2:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo2,.-foo2
|
6
ld/testsuite/ld-elf/init3.s
Normal file
6
ld/testsuite/ld-elf/init3.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .init
|
||||||
|
.p2align 4
|
||||||
|
.type foo3,%function
|
||||||
|
foo3:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size foo3,.-foo3
|
6
ld/testsuite/ld-elf/initn.s
Normal file
6
ld/testsuite/ld-elf/initn.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .init
|
||||||
|
.p2align 8
|
||||||
|
.type last,%function
|
||||||
|
last:
|
||||||
|
.dc.a 0x0
|
||||||
|
.size last,.-last
|
15
ld/testsuite/ld-elf/pr14156a.d
Normal file
15
ld/testsuite/ld-elf/pr14156a.d
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#source: init0.s
|
||||||
|
#source: init1.s
|
||||||
|
#source: init2.s
|
||||||
|
#source: init3.s
|
||||||
|
#source: initn.s
|
||||||
|
#ld: --sort-section=alignment
|
||||||
|
#nm: -n
|
||||||
|
|
||||||
|
#...
|
||||||
|
[0-9a-f]+ T foo
|
||||||
|
[0-9a-f]+ t foo1
|
||||||
|
[0-9a-f]+ t foo2
|
||||||
|
[0-9a-f]+ t foo3
|
||||||
|
[0-9a-f]+ t last
|
||||||
|
#pass
|
15
ld/testsuite/ld-elf/pr14156b.d
Normal file
15
ld/testsuite/ld-elf/pr14156b.d
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#source: fini0.s
|
||||||
|
#source: fini1.s
|
||||||
|
#source: fini2.s
|
||||||
|
#source: fini3.s
|
||||||
|
#source: finin.s
|
||||||
|
#ld: --sort-section=alignment
|
||||||
|
#nm: -n
|
||||||
|
|
||||||
|
#...
|
||||||
|
[0-9a-f]+ T foo
|
||||||
|
[0-9a-f]+ t foo1
|
||||||
|
[0-9a-f]+ t foo2
|
||||||
|
[0-9a-f]+ t foo3
|
||||||
|
[0-9a-f]+ t last
|
||||||
|
#pass
|
15
ld/testsuite/ld-elf/pr14156c.d
Normal file
15
ld/testsuite/ld-elf/pr14156c.d
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#source: foo0.s
|
||||||
|
#source: foo1.s
|
||||||
|
#source: foo2.s
|
||||||
|
#source: foo3.s
|
||||||
|
#source: foon.s
|
||||||
|
#ld: --sort-section=alignment -T pr14156c.t
|
||||||
|
#nm: -n
|
||||||
|
|
||||||
|
#...
|
||||||
|
[0-9a-f]+ T foo
|
||||||
|
[0-9a-f]+ t foo1
|
||||||
|
[0-9a-f]+ t foo2
|
||||||
|
[0-9a-f]+ t foo3
|
||||||
|
[0-9a-f]+ t last
|
||||||
|
#pass
|
4
ld/testsuite/ld-elf/pr14156c.t
Normal file
4
ld/testsuite/ld-elf/pr14156c.t
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
SECTIONS {
|
||||||
|
.foo : { *(SORT_NONE(.foo)) }
|
||||||
|
/DISCARD/ : { *(.*) }
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user