diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 56cddda6417b80ff6959505e8561389e243114c7..0d12f4533acec02d57cfe51cd3c8912dfb33fecd 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1473,7 +1473,7 @@ struct elf_backend_data unsigned int); /* Merge GNU properties. Return TRUE if property is updated. */ - bfd_boolean (*merge_gnu_properties) (struct bfd_link_info *, bfd *, + bfd_boolean (*merge_gnu_properties) (struct bfd_link_info *, bfd *, bfd *, elf_property *, elf_property *); /* Set up GNU properties. */ diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c index 0c3f19ce56a36bb18d9afd2e140d735eeaf9c6a9..94ef2351cb632828c66127907137e7d523cb719d 100644 --- a/bfd/elf-properties.c +++ b/bfd/elf-properties.c @@ -198,7 +198,7 @@ next: with ABFD. */ static bfd_boolean -elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd, +elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd, bfd *bbfd, elf_property *aprop, elf_property *bprop) { const struct elf_backend_data *bed = get_elf_backend_data (abfd); @@ -207,7 +207,7 @@ elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd, if (bed->merge_gnu_properties != NULL && pr_type >= GNU_PROPERTY_LOPROC && pr_type < GNU_PROPERTY_LOUSER) - return bed->merge_gnu_properties (info, abfd, aprop, bprop); + return bed->merge_gnu_properties (info, abfd, bbfd, aprop, bprop); switch (pr_type) { @@ -289,7 +289,7 @@ elf_merge_gnu_property_list (struct bfd_link_info *info, bfd *first_pbfd, TRUE); /* Pass NULL to elf_merge_gnu_properties for the property which isn't on *LISTP. */ - elf_merge_gnu_properties (info, first_pbfd, &p->property, pr); + elf_merge_gnu_properties (info, first_pbfd, abfd, &p->property, pr); if (p->property.pr_kind == property_remove) { if (info->has_map_file) @@ -365,7 +365,7 @@ elf_merge_gnu_property_list (struct bfd_link_info *info, bfd *first_pbfd, else number_p = FALSE; - if (elf_merge_gnu_properties (info, first_pbfd, NULL, &p->property)) + if (elf_merge_gnu_properties (info, first_pbfd, abfd, NULL, &p->property)) { if (p->property.pr_type == GNU_PROPERTY_NO_COPY_ON_PROTECTED) elf_has_no_copy_on_protected (first_pbfd) = TRUE; diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index 50541f05a8babac3178e8c5d3dfac5c19e075ff9..57a723d547734b4a4b5074fb7c90811e9bd56184 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -9968,7 +9968,7 @@ elfNN_aarch64_link_setup_gnu_properties (struct bfd_link_info *info) for the effect of GNU properties of the output_bfd. */ static bfd_boolean elfNN_aarch64_merge_gnu_properties (struct bfd_link_info *info, - bfd *abfd, + bfd *abfd, bfd *bbfd, elf_property *aprop, elf_property *bprop) { @@ -9977,17 +9977,26 @@ elfNN_aarch64_merge_gnu_properties (struct bfd_link_info *info, /* If output has been marked with BTI using command line argument, give out warning if necessary. */ - if ((prop & GNU_PROPERTY_AARCH64_FEATURE_1_BTI) + /* Properties are merged per type, hence only check for warnings when merging + GNU_PROPERTY_AARCH64_FEATURE_1_AND. */ + if (((aprop && aprop->pr_type == GNU_PROPERTY_AARCH64_FEATURE_1_AND) + || (bprop && bprop->pr_type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)) + && (prop & GNU_PROPERTY_AARCH64_FEATURE_1_BTI) && (!elf_aarch64_tdata (info->output_bfd)->no_bti_warn)) { if ((aprop && !(aprop->u.number & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) - || (bprop && !(bprop->u.number & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) - /* If either property is NULL, it means its bfd did not have any - property. */ - || !aprop || !bprop) + || !aprop) { - _bfd_error_handler (_("warning: BTI turned on by --force-bti when " - "all inputs do not have BTI in NOTE section.")); + _bfd_error_handler (_("%pB: warning: BTI turned on by --force-bti when " + "all inputs do not have BTI in NOTE section."), + abfd); + } + if ((bprop && !(bprop->u.number & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) + || !bprop) + { + _bfd_error_handler (_("%pB: warning: BTI turned on by --force-bti when " + "all inputs do not have BTI in NOTE section."), + bbfd); } } diff --git a/bfd/elfxx-aarch64.c b/bfd/elfxx-aarch64.c index aa1c67ec4bfc46722540774dedb810b225b64cb6..1d26d848019a59625e221e4966d7c38631be4998 100644 --- a/bfd/elfxx-aarch64.c +++ b/bfd/elfxx-aarch64.c @@ -719,6 +719,11 @@ _bfd_aarch64_elf_link_setup_gnu_properties (struct bfd_link_info *info, prop = _bfd_elf_get_property (ebfd, GNU_PROPERTY_AARCH64_FEATURE_1_AND, 4); + if (gnu_prop & GNU_PROPERTY_AARCH64_FEATURE_1_BTI + && !(prop->u.number & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) + _bfd_error_handler (_("%pB: warning: BTI turned on by --force-bti " + "when all inputs do not have BTI in NOTE " + "section."), ebfd); prop->u.number |= gnu_prop; prop->pr_kind = property_number; diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h index 28d540b83b3fb9dbb6a6980b5c67cdd7998b4e00..4df2173a5842f92b691e4680156bad70e2043507 100644 --- a/bfd/elfxx-x86.h +++ b/bfd/elfxx-x86.h @@ -691,7 +691,7 @@ extern enum elf_property_kind _bfd_x86_elf_parse_gnu_properties (bfd *, unsigned int, bfd_byte *, unsigned int); extern bfd_boolean _bfd_x86_elf_merge_gnu_properties - (struct bfd_link_info *, bfd *, elf_property *, elf_property *); + (struct bfd_link_info *, bfd *, bfd *, elf_property *, elf_property *); extern void _bfd_x86_elf_link_fixup_gnu_properties (struct bfd_link_info *, elf_property_list **); diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 584a75f996054f30a93b0c3f5449ae39f36bbfdf..5703b5f389a0fafd4a086c22c357d060a6c042a1 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -2401,6 +2401,7 @@ _bfd_x86_elf_parse_gnu_properties (bfd *abfd, unsigned int type, bfd_boolean _bfd_x86_elf_merge_gnu_properties (struct bfd_link_info *info, bfd *abfd ATTRIBUTE_UNUSED, + bfd *bbfd ATTRIBUTE_UNUSED, elf_property *aprop, elf_property *bprop) { diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp index 12c2d97d53770e886bb913e19aef996a64fc1805..ba3ce36191f49b2ce25880b7a61408b6e8875884 100644 --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp @@ -407,3 +407,5 @@ run_dump_test "pac-plt-1" run_dump_test "pac-plt-2" run_dump_test "bti-pac-plt-1" run_dump_test "bti-pac-plt-2" + +run_dump_test "bti-warn" diff --git a/ld/testsuite/ld-aarch64/bti-plt-1.s b/ld/testsuite/ld-aarch64/bti-plt-1.s index b798ca4e8ceeb192f6cf67a21be2eb5337a70fee..8bb39c44f8de4d2f7a24172e730b36742cb9b926 100644 --- a/ld/testsuite/ld-aarch64/bti-plt-1.s +++ b/ld/testsuite/ld-aarch64/bti-plt-1.s @@ -21,3 +21,20 @@ _start: .p2align 3 5: .endif +.ifdef __property_pac__ + .section ".note.gnu.property", "a" + .p2align 3 + .long 1f - 0f /* name length */ + .long 5f - 2f /* data length */ + .long 5 /* note type */ +0: .asciz "GNU" /* vendor name */ +1: + .p2align 3 +2: .long 0xc0000000 /* pr_type. */ + .long 4f - 3f /* pr_datasz. */ +3: + .long 0x2 /* PAC. */ +4: + .p2align 3 +5: +.endif diff --git a/ld/testsuite/ld-aarch64/bti-plt-6.d b/ld/testsuite/ld-aarch64/bti-plt-6.d index c7d5169e810e635ff787503e96e27c1fe4a12731..30d225d4dec80ab454da15787023a1096c73606b 100644 --- a/ld/testsuite/ld-aarch64/bti-plt-6.d +++ b/ld/testsuite/ld-aarch64/bti-plt-6.d @@ -1,9 +1,9 @@ #name: Warn with one missing GNU NOTE BTI input -#source: property-bti-pac1.s #source: property-bti-pac2.s +#source: property-bti-pac1.s #as: -mabi=lp64 -defsym __property_pac__=1 #ld: -shared --force-bti -#warning: .*: warning: BTI turned on by --force-bti.*$ +#warning: .*property-bti-pac2.*: warning: BTI turned on by --force-bti.*$ #readelf: -n # Should warn about the missing input BTI NOTE but should diff --git a/ld/testsuite/ld-aarch64/bti-plt-7.d b/ld/testsuite/ld-aarch64/bti-plt-7.d index 625f2847b0c9564ef7af7a2b95ea3e368ddf8b08..e8fa0d3a09163bae08d87620c718b5c765462b32 100644 --- a/ld/testsuite/ld-aarch64/bti-plt-7.d +++ b/ld/testsuite/ld-aarch64/bti-plt-7.d @@ -1,9 +1,10 @@ #name: Warn when neither inputs has GNU NOTE BTI -#source: property-bti-pac1.s +#source: property-bti-pac2.s #source: plt_mapping_symbol.s #as: -mabi=lp64 #ld: -shared --force-bti -#warning: .*: warning: BTI turned on by --force-bti.*$ +#warning: .*plt_mapping_symbol.*: warning: BTI turned on by --force-bti.* +#warning: .*property-bti-pac2.*: warning: BTI turned on by --force-bti.* #readelf: -n # Should warn about the missing input BTI NOTE but should diff --git a/ld/testsuite/ld-aarch64/bti-warn.d b/ld/testsuite/ld-aarch64/bti-warn.d new file mode 100644 index 0000000000000000000000000000000000000000..c2edccf15f11ee06c09143b763837dbb950ba946 --- /dev/null +++ b/ld/testsuite/ld-aarch64/bti-warn.d @@ -0,0 +1,16 @@ +#name: Warn when both have GNU prop but neither BTI +#source: property-bti-pac2.s +#source: bti-plt-1.s +#as: -mabi=lp64 --defsym __guard_property_bti__=1 --defsym __property_pac__=1 +#ld: -shared --force-bti +#warning: .*property-bti-pac2.*: warning: BTI turned on by --force-bti.* +#warning: .*bti-plt-1.*: warning: BTI turned on by --force-bti.* +#readelf: -n + +# Should warn about the missing input BTI NOTE but should +# still mark output as BTI + +Displaying notes found in: .note.gnu.property + Owner Data size Description + GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 + Properties: AArch64 feature: BTI, PAC