mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-22 08:43:33 +08:00
a2575bec24
The original patch did not give the target enough hooks to discover that an input object file does not have a particular property. For the GNU_PROPERTY_X86_FEATURE_1_AND property, for example, where a missing property should be assumed to be all zeroes, and ANDed with other object modules, this is essential. We now store the target-specific properties locally in the Target structure as native uint32_t fields, then AND the per-object feature bits with the program's feature bits when we're finished processing each input object file. The target-specific properties are then added back to the output note section during finalization. gold/ PR gold/22914 * layout.cc (read_sized_value): Fix spelling of section name. (Layout::layout_gnu_property): Call Sized_target::record_gnu_property for target-specific properties; don't store them with target-independent properties yet. (Layout::merge_gnu_properties): New method. (Layout::add_gnu_property): New method. (Layout::create_gnu_properties_note): Call target to finalize target-specific properties. Fix spelling of output section name. * layout.h (Layout::merge_gnu_properties): New method. (Layout::add_gnu_property): New method. * object.cc (Sized_relobj_file::do_layout): Call Layout::merge_gnu_properties. * target.h (Target::merge_gnu_property): Remove. (Target::finalize_gnu_properties): New method. (Target::do_merge_gnu_property): Move to Sized_target and rename. (Target::do_finalize_gnu_properties): New virtual method. (Sized_target::record_gnu_property): Moved and renamed from Target::do_merge_gnu_property. (Sized_target::merge_gnu_properties): New virtual method. * x86_64.cc (Target_x86_64::isa_1_used_, isa_1_needed_) (feature_1_, object_feature_1_, seen_first_object_): New data members. (Target_x86_64::do_merge_gnu_property): Rename to ... (Target_x86_64::record_gnu_property): ... this. Save target-specific properties in Target class object. (Target_x86_64::merge_gnu_properties): New method. (add_property): New static inline function. (Target_x86_64::do_finalize_gnu_properties): New method. * testsuite/Makefile.am (gnu_property_test): Remove C source file; link directly without compiler driver. * testsuite/Makefile.in: Regenerate. * testsuite/gnu_property_a.S: Add _start.
47 lines
1.1 KiB
ArmAsm
47 lines
1.1 KiB
ArmAsm
#define NT_GNU_PROPERTY_TYPE_0 5
|
|
|
|
#define GNU_PROPERTY_STACK_SIZE 1
|
|
#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000
|
|
#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001
|
|
#define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002
|
|
|
|
#if __SIZEOF_PTRDIFF_T__ == 8
|
|
# define ALIGN 3
|
|
#elif __SIZEOF_PTRDIFF_T__ == 4
|
|
# define ALIGN 2
|
|
#endif
|
|
|
|
.text
|
|
.globl _start
|
|
_start:
|
|
ret
|
|
|
|
.section ".note.gnu.property", "a"
|
|
.p2align ALIGN
|
|
|
|
.long 1f - 0f /* name length */
|
|
.long 5f - 2f /* data length */
|
|
.long NT_GNU_PROPERTY_TYPE_0 /* note type */
|
|
0: .asciz "GNU" /* vendor name */
|
|
1:
|
|
.p2align ALIGN
|
|
2: .long GNU_PROPERTY_STACK_SIZE /* pr_type. */
|
|
.long 4f - 3f /* pr_datasz. */
|
|
3:
|
|
.dc.a 0x800 /* Stack size. */
|
|
4:
|
|
.p2align ALIGN
|
|
.long GNU_PROPERTY_X86_ISA_1_USED
|
|
.long 4
|
|
.byte 0x01,0x10,0x00,0x00
|
|
.p2align ALIGN
|
|
.long GNU_PROPERTY_X86_ISA_1_NEEDED
|
|
.long 4
|
|
.byte 0x01,0x10,0x00,0x00
|
|
.p2align ALIGN
|
|
.long GNU_PROPERTY_X86_FEATURE_1_AND
|
|
.long 4
|
|
.byte 0x01,0x00,0x00,0x00
|
|
.p2align ALIGN
|
|
5:
|