x86: Properly merge GNU_PROPERTY_X86_ISA_1_USED

Without the GNU_PROPERTY_X86_ISA_1_USED property, all ISAs may be used.
If a bit in the GNU_PROPERTY_X86_ISA_1_USED property is unset, the
corresponding x86 instruction set isn’t used.  When merging properties
from 2 input files and one input file doesn't have the
GNU_PROPERTY_X86_ISA_1_USED property, the output file shouldn't have
it neither.  This patch removes the GNU_PROPERTY_X86_ISA_1_USED
property if an input file doesn't have it.

This patch replaces the GNU_PROPERTY_X86_ISA_1_USED property with the
GNU_PROPERTY_X86_ISA_1_NEEDED property which is the minimum ISA
requirement.

bfd/

	PR ld/23486
	* elfxx-x86.c (_bfd_x86_elf_merge_gnu_properties): Remove
	GNU_PROPERTY_X86_ISA_1_USED if an input file doesn't have it.
	(_bfd_x86_elf_link_setup_gnu_properties): Adding the
	GNU_PROPERTY_X86_ISA_1_NEEDED, instead of
	GNU_PROPERTY_X86_ISA_1_USED, property.

ld/

	PR ld/23486
	* testsuite/ld-i386/i386.exp: Run PR ld/23486 tests.
	* testsuite/ld-x86-64/x86-64.exp: Likewise.
	* testsuite/ld-i386/pr23486a.d: New file.
	* testsuite/ld-i386/pr23486b.d: Likewise.
	* testsuite/ld-x86-64/pr23486a-x32.d: Likewise.
	* testsuite/ld-x86-64/pr23486a.d: Likewise.
	* testsuite/ld-x86-64/pr23486a.s: Likewise.
	* testsuite/ld-x86-64/pr23486b-x32.d: Likewise.
	* testsuite/ld-x86-64/pr23486b.d: Likewise.
	* testsuite/ld-x86-64/pr23486b.s: Likewise.
	* testsuite/ld-i386/property-3.r: Remove "x86 ISA used".
	* testsuite/ld-i386/property-4.r: Likewise.
	* testsuite/ld-i386/property-5.r: Likewise.
	* testsuite/ld-i386/property-x86-ibt3a.d: Likewise.
	* testsuite/ld-i386/property-x86-ibt3b.d: Likewise.
	* testsuite/ld-i386/property-x86-shstk3a.d: Likewise.
	* testsuite/ld-i386/property-x86-shstk3b.d: Likewise.
	* testsuite/ld-x86-64/property-3.r: Likewise.
	* testsuite/ld-x86-64/property-4.r: Likewise.
	* testsuite/ld-x86-64/property-5.r: Likewise.
	* testsuite/ld-x86-64/property-x86-ibt3a-x32.d: Likewise.
	* testsuite/ld-x86-64/property-x86-ibt3a.d: Likewise.
	* testsuite/ld-x86-64/property-x86-ibt3b-x32.d: Likewise.
	* testsuite/ld-x86-64/property-x86-ibt3b.d: Likewise.
	* testsuite/ld-x86-64/property-x86-shstk3a-x32.d: Likewise.
	* testsuite/ld-x86-64/property-x86-shstk3a.d: Likewise.
	* testsuite/ld-x86-64/property-x86-shstk3b-x32.d: Likewise.
	* testsuite/ld-x86-64/property-x86-shstk3b.d: Likewise.
This commit is contained in:
H.J. Lu
2018-08-08 06:09:15 -07:00
parent 9d4a934ce6
commit f7309df20c
31 changed files with 211 additions and 47 deletions

View File

@ -1,3 +1,12 @@
2018-08-08 H.J. Lu <hongjiu.lu@intel.com>
PR ld/23486
* elfxx-x86.c (_bfd_x86_elf_merge_gnu_properties): Remove
GNU_PROPERTY_X86_ISA_1_USED if an input file doesn't have it.
(_bfd_x86_elf_link_setup_gnu_properties): Adding the
GNU_PROPERTY_X86_ISA_1_NEEDED, instead of
GNU_PROPERTY_X86_ISA_1_USED, property.
2018-08-07 Alan Modra <amodra@gmail.com> 2018-08-07 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (struct map_stub): Delete tls_get_addr_opt_bctrl. * elf64-ppc.c (struct map_stub): Delete tls_get_addr_opt_bctrl.

View File

@ -2407,12 +2407,27 @@ _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
switch (pr_type) switch (pr_type)
{ {
case GNU_PROPERTY_X86_ISA_1_USED: case GNU_PROPERTY_X86_ISA_1_USED:
if (aprop == NULL || bprop == NULL)
{
/* Only one of APROP and BPROP can be NULL. */
if (aprop != NULL)
{
/* Remove this property since the other input file doesn't
have it. */
aprop->pr_kind = property_remove;
updated = TRUE;
}
break;
}
goto or_property;
case GNU_PROPERTY_X86_ISA_1_NEEDED: case GNU_PROPERTY_X86_ISA_1_NEEDED:
if (aprop != NULL && bprop != NULL) if (aprop != NULL && bprop != NULL)
{ {
or_property:
number = aprop->u.number; number = aprop->u.number;
aprop->u.number = number | bprop->u.number; aprop->u.number = number | bprop->u.number;
/* Remove the property if ISA bits are empty. */ /* Remove the property if all bits are empty. */
if (aprop->u.number == 0) if (aprop->u.number == 0)
{ {
aprop->pr_kind = property_remove; aprop->pr_kind = property_remove;
@ -2428,14 +2443,14 @@ _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info,
{ {
if (aprop->u.number == 0) if (aprop->u.number == 0)
{ {
/* Remove APROP if ISA bits are empty. */ /* Remove APROP if all bits are empty. */
aprop->pr_kind = property_remove; aprop->pr_kind = property_remove;
updated = TRUE; updated = TRUE;
} }
} }
else else
{ {
/* Return TRUE if APROP is NULL and ISA bits of BPROP /* Return TRUE if APROP is NULL and all bits of BPROP
aren't empty to indicate that BPROP should be added aren't empty to indicate that BPROP should be added
to ABFD. */ to ABFD. */
updated = bprop->u.number != 0; updated = bprop->u.number != 0;
@ -2582,9 +2597,9 @@ _bfd_x86_elf_link_setup_gnu_properties
{ {
/* If the separate code program header is needed, make sure /* If the separate code program header is needed, make sure
that the first read-only PT_LOAD segment has no code by that the first read-only PT_LOAD segment has no code by
adding a GNU_PROPERTY_X86_ISA_1_USED note. */ adding a GNU_PROPERTY_X86_ISA_1_NEEDED note. */
prop = _bfd_elf_get_property (ebfd, prop = _bfd_elf_get_property (ebfd,
GNU_PROPERTY_X86_ISA_1_USED, GNU_PROPERTY_X86_ISA_1_NEEDED,
4); 4);
prop->u.number = GNU_PROPERTY_X86_ISA_1_486; prop->u.number = GNU_PROPERTY_X86_ISA_1_486;
prop->pr_kind = property_number; prop->pr_kind = property_number;

View File

@ -1,3 +1,35 @@
2018-08-08 H.J. Lu <hongjiu.lu@intel.com>
PR ld/23486
* testsuite/ld-i386/i386.exp: Run PR ld/23486 tests.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/pr23486a.d: New file.
* testsuite/ld-i386/pr23486b.d: Likewise.
* testsuite/ld-x86-64/pr23486a-x32.d: Likewise.
* testsuite/ld-x86-64/pr23486a.d: Likewise.
* testsuite/ld-x86-64/pr23486a.s: Likewise.
* testsuite/ld-x86-64/pr23486b-x32.d: Likewise.
* testsuite/ld-x86-64/pr23486b.d: Likewise.
* testsuite/ld-x86-64/pr23486b.s: Likewise.
* testsuite/ld-i386/property-3.r: Remove "x86 ISA used".
* testsuite/ld-i386/property-4.r: Likewise.
* testsuite/ld-i386/property-5.r: Likewise.
* testsuite/ld-i386/property-x86-ibt3a.d: Likewise.
* testsuite/ld-i386/property-x86-ibt3b.d: Likewise.
* testsuite/ld-i386/property-x86-shstk3a.d: Likewise.
* testsuite/ld-i386/property-x86-shstk3b.d: Likewise.
* testsuite/ld-x86-64/property-3.r: Likewise.
* testsuite/ld-x86-64/property-4.r: Likewise.
* testsuite/ld-x86-64/property-5.r: Likewise.
* testsuite/ld-x86-64/property-x86-ibt3a-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-ibt3a.d: Likewise.
* testsuite/ld-x86-64/property-x86-ibt3b-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-ibt3b.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3a-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3a.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3b-x32.d: Likewise.
* testsuite/ld-x86-64/property-x86-shstk3b.d: Likewise.
2018-08-07 Alan Modra <amodra@gmail.com> 2018-08-07 Alan Modra <amodra@gmail.com>
* testsuite/ld-powerpc/notoc.s: Generate some cfi. * testsuite/ld-powerpc/notoc.s: Generate some cfi.

View File

@ -462,6 +462,8 @@ run_dump_test "pr23189"
run_dump_test "pr23194" run_dump_test "pr23194"
run_dump_test "pr23372a" run_dump_test "pr23372a"
run_dump_test "pr23372b" run_dump_test "pr23372b"
run_dump_test "pr23486a"
run_dump_test "pr23486b"
if { !([istarget "i?86-*-linux*"] if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"] || [istarget "i?86-*-gnu*"]

View File

@ -0,0 +1,10 @@
#source: ../ld-x86-64/pr23486a.s
#source: ../ld-x86-64/pr23486b.s
#as: --32
#ld: -r -m elf_i386
#readelf: -n
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA needed: i486, 586

View File

@ -0,0 +1,10 @@
#source: ../ld-x86-64/pr23486b.s
#source: ../ld-x86-64/pr23486a.s
#as: --32
#ld: -r -m elf_i386
#readelf: -n
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA needed: i486, 586

View File

@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0
Properties: stack size: 0x800000 Properties: stack size: 0x800000
x86 ISA used: 586, SSE
x86 ISA needed: i486, 586 x86 ISA needed: i486, 586
#pass #pass

View File

@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0
Properties: stack size: 0x800000 Properties: stack size: 0x800000
x86 ISA used: i486, 586, SSE
x86 ISA needed: i486, 586, SSE x86 ISA needed: i486, 586, SSE
#pass #pass

View File

@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0
Properties: stack size: 0x900000 Properties: stack size: 0x900000
x86 ISA used: i486, 586, SSE
x86 ISA needed: i486, 586, SSE x86 ISA needed: i486, 586, SSE
#pass #pass

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: i486, 586, SSE2, SSE3 Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1
x86 ISA needed: 586, SSE, SSE3, SSE4_1

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: i486, 586, SSE2, SSE3 Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1
x86 ISA needed: 586, SSE, SSE3, SSE4_1

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: i486, 586, SSE2, SSE3 Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1
x86 ISA needed: 586, SSE, SSE3, SSE4_1

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: i486, 586, SSE2, SSE3 Properties: x86 ISA needed: 586, SSE, SSE3, SSE4_1
x86 ISA needed: 586, SSE, SSE3, SSE4_1

View File

@ -0,0 +1,10 @@
#source: pr23486a.s
#source: pr23486b.s
#as: --x32
#ld: -r -m elf32_x86_64
#readelf: -n
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA needed: i486, 586

View File

@ -0,0 +1,10 @@
#source: pr23486a.s
#source: pr23486b.s
#as: --64 -defsym __64_bit__=1
#ld: -r -m elf_x86_64
#readelf: -n
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA needed: i486, 586

View File

@ -0,0 +1,30 @@
.section ".note.gnu.property", "a"
.ifdef __64_bit__
.p2align 3
.else
.p2align 2
.endif
.long 1f - 0f /* name length. */
.long 4f - 1f /* data length. */
/* NT_GNU_PROPERTY_TYPE_0 */
.long 5 /* note type. */
0:
.asciz "GNU" /* vendor name. */
1:
.ifdef __64_bit__
.p2align 3
.else
.p2align 2
.endif
/* GNU_PROPERTY_X86_ISA_1_USED */
.long 0xc0000000 /* pr_type. */
.long 3f - 2f /* pr_datasz. */
2:
.long 0xa
3:
.ifdef __64_bit__
.p2align 3
.else
.p2align 2
.endif
4:

View File

@ -0,0 +1,10 @@
#source: pr23486b.s
#source: pr23486a.s
#as: --x32
#ld: -r -m elf32_x86_64
#readelf: -n
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA needed: i486, 586

View File

@ -0,0 +1,10 @@
#source: pr23486a.s
#source: pr23486b.s
#as: --64 -defsym __64_bit__=1
#ld: -r -m elf_x86_64
#readelf: -n
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA needed: i486, 586

View File

@ -0,0 +1,30 @@
.section ".note.gnu.property", "a"
.ifdef __64_bit__
.p2align 3
.else
.p2align 2
.endif
.long 1f - 0f /* name length. */
.long 4f - 1f /* data length. */
/* NT_GNU_PROPERTY_TYPE_0 */
.long 5 /* note type. */
0:
.asciz "GNU" /* vendor name. */
1:
.ifdef __64_bit__
.p2align 3
.else
.p2align 2
.endif
/* GNU_PROPERTY_X86_ISA_1_NEEDED */
.long 0xc0000001 /* pr_type. */
.long 3f - 2f /* pr_datasz. */
2:
.long 0x3
3:
.ifdef __64_bit__
.p2align 3
.else
.p2align 2
.endif
4:

View File

@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0
Properties: stack size: 0x800000 Properties: stack size: 0x800000
x86 ISA used: 586, SSE
x86 ISA needed: i486, 586 x86 ISA needed: i486, 586
#pass #pass

View File

@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0
Properties: stack size: 0x800000 Properties: stack size: 0x800000
x86 ISA used: i486, 586, SSE
x86 ISA needed: i486, 586, SSE x86 ISA needed: i486, 586, SSE
#pass #pass

View File

@ -3,6 +3,5 @@ Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0 GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0
Properties: stack size: 0x900000 Properties: stack size: 0x900000
x86 ISA used: i486, 586, SSE
x86 ISA needed: i486, 586, SSE x86 ISA needed: i486, 586, SSE
#pass #pass

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 Properties: x86 ISA needed: i486, 586, SSE2, SSE3
x86 ISA needed: i486, 586, SSE2, SSE3

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 Properties: x86 ISA needed: i486, 586, SSE2, SSE3
x86 ISA needed: i486, 586, SSE2, SSE3

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 Properties: x86 ISA needed: i486, 586, SSE2, SSE3
x86 ISA needed: i486, 586, SSE2, SSE3

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 Properties: x86 ISA needed: i486, 586, SSE2, SSE3
x86 ISA needed: i486, 586, SSE2, SSE3

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 Properties: x86 ISA needed: i486, 586, SSE2, SSE3
x86 ISA needed: i486, 586, SSE2, SSE3

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 Properties: x86 ISA needed: i486, 586, SSE2, SSE3
x86 ISA needed: i486, 586, SSE2, SSE3

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 Properties: x86 ISA needed: i486, 586, SSE2, SSE3
x86 ISA needed: i486, 586, SSE2, SSE3

View File

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property Displaying notes found in: .note.gnu.property
Owner Data size Description Owner Data size Description
GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0 GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1 Properties: x86 ISA needed: i486, 586, SSE2, SSE3
x86 ISA needed: i486, 586, SSE2, SSE3

View File

@ -403,6 +403,10 @@ run_dump_test "pr23372a"
run_dump_test "pr23372a-x32" run_dump_test "pr23372a-x32"
run_dump_test "pr23372b" run_dump_test "pr23372b"
run_dump_test "pr23372b-x32" run_dump_test "pr23372b-x32"
run_dump_test "pr23486a"
run_dump_test "pr23486a-x32"
run_dump_test "pr23486b"
run_dump_test "pr23486b-x32"
if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} { if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
return return