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>
* 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)
{
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:
if (aprop != NULL && bprop != NULL)
{
or_property:
number = aprop->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)
{
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)
{
/* Remove APROP if ISA bits are empty. */
/* Remove APROP if all bits are empty. */
aprop->pr_kind = property_remove;
updated = TRUE;
}
}
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
to ABFD. */
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
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,
GNU_PROPERTY_X86_ISA_1_USED,
GNU_PROPERTY_X86_ISA_1_NEEDED,
4);
prop->u.number = GNU_PROPERTY_X86_ISA_1_486;
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>
* 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 "pr23372a"
run_dump_test "pr23372b"
run_dump_test "pr23486a"
run_dump_test "pr23486b"
if { !([istarget "i?86-*-linux*"]
|| [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
GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0
Properties: stack size: 0x800000
x86 ISA used: 586, SSE
x86 ISA needed: i486, 586
#pass

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: i486, 586, SSE2, SSE3
x86 ISA needed: 586, SSE, SSE3, SSE4_1
GNU 0x0000000c NT_GNU_PROPERTY_TYPE_0
Properties: 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
GNU 0x[0-9a-f]+ NT_GNU_PROPERTY_TYPE_0
Properties: stack size: 0x800000
x86 ISA used: 586, SSE
x86 ISA needed: i486, 586
#pass

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -6,6 +6,5 @@
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
Properties: x86 ISA used: 586, SSE, SSE3, SSE4_1
x86 ISA needed: i486, 586, SSE2, SSE3
GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0
Properties: 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 "pr23372b"
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*"]} {
return