@@ -98,6 +98,7 @@ fn add_gnu_property_note(
98
98
file : & mut write:: Object < ' static > ,
99
99
architecture : Architecture ,
100
100
binary_format : BinaryFormat ,
101
+ endianness : Endianness ,
101
102
) {
102
103
// check bti protection
103
104
if binary_format != BinaryFormat :: Elf
@@ -115,23 +116,26 @@ fn add_gnu_property_note(
115
116
let n_namsz: u32 = 4 ; // Size of the n_name field
116
117
let n_descsz: u32 = 16 ; // Size of the n_desc field
117
118
let n_type: u32 = NT_GNU_PROPERTY_TYPE_0 ; // Type of note descriptor
118
- let values = [ n_namsz, n_descsz, n_type] ;
119
- values . map ( |v| data . extend_from_slice ( & ( v . to_le_bytes ( ) ) ) ) ;
120
- data . push ( b'G' ) ; // Owner of the program property note
121
- data. push ( b'N' ) ;
122
- data . push ( b'U' ) ;
123
- data. push ( 0 ) ;
119
+ let header_values = [ n_namsz, n_descsz, n_type] ;
120
+ match endianness {
121
+ Endianness :: Little => header_values . map ( |v| data . extend_from_slice ( & ( v . to_le_bytes ( ) ) ) ) ,
122
+ Endianness :: Big => header_values . map ( |v| data. extend_from_slice ( & ( v . to_be_bytes ( ) ) ) ) ,
123
+ } ;
124
+ data. extend_from_slice ( b"GNU \0 " ) ; // Owner of the program property note
124
125
let pr_type: u32 = match architecture {
125
126
Architecture :: X86_64 => 0xc0000002 ,
126
127
Architecture :: Aarch64 => 0xc0000000 ,
127
128
_ => unreachable ! ( ) ,
128
129
} ;
129
130
let pr_datasz: u32 = 4 ; //size of the pr_data field
130
131
let pr_data: u32 = 3 ; //program property descriptor
131
- let pr_padding: u32 = 3 ;
132
- let values = [ pr_type, pr_datasz, pr_data, pr_padding] ;
133
- values. map ( |v| data. extend_from_slice ( & ( v. to_le_bytes ( ) ) ) ) ;
134
- file. append_section_data ( section, & data, 4 ) ;
132
+ let pr_padding: u32 = 0 ;
133
+ let property_values = [ pr_type, pr_datasz, pr_data, pr_padding] ;
134
+ match endianness {
135
+ Endianness :: Little => property_values. map ( |v| data. extend_from_slice ( & ( v. to_le_bytes ( ) ) ) ) ,
136
+ Endianness :: Big => property_values. map ( |v| data. extend_from_slice ( & ( v. to_be_bytes ( ) ) ) ) ,
137
+ } ;
138
+ file. append_section_data ( section, & data, 8 ) ;
135
139
}
136
140
137
141
pub ( crate ) fn create_object_file ( sess : & Session ) -> Option < write:: Object < ' static > > {
@@ -246,7 +250,7 @@ pub(crate) fn create_object_file(sess: &Session) -> Option<write::Object<'static
246
250
_ => elf:: ELFOSABI_NONE ,
247
251
} ;
248
252
let abi_version = 0 ;
249
- add_gnu_property_note ( & mut file, architecture, binary_format) ;
253
+ add_gnu_property_note ( & mut file, architecture, binary_format, endianness ) ;
250
254
file. flags = FileFlags :: Elf { os_abi, abi_version, e_flags } ;
251
255
Some ( file)
252
256
}
0 commit comments