Add GNU Property Note
This commit is contained in:
parent
cb4f8153d8
commit
68a5bb4de1
3 changed files with 33 additions and 11 deletions
|
@ -98,6 +98,7 @@ fn add_gnu_property_note(
|
||||||
file: &mut write::Object<'static>,
|
file: &mut write::Object<'static>,
|
||||||
architecture: Architecture,
|
architecture: Architecture,
|
||||||
binary_format: BinaryFormat,
|
binary_format: BinaryFormat,
|
||||||
|
endianness: Endianness,
|
||||||
) {
|
) {
|
||||||
// check bti protection
|
// check bti protection
|
||||||
if binary_format != BinaryFormat::Elf
|
if binary_format != BinaryFormat::Elf
|
||||||
|
@ -115,12 +116,12 @@ fn add_gnu_property_note(
|
||||||
let n_namsz: u32 = 4; // Size of the n_name field
|
let n_namsz: u32 = 4; // Size of the n_name field
|
||||||
let n_descsz: u32 = 16; // Size of the n_desc field
|
let n_descsz: u32 = 16; // Size of the n_desc field
|
||||||
let n_type: u32 = NT_GNU_PROPERTY_TYPE_0; // Type of note descriptor
|
let n_type: u32 = NT_GNU_PROPERTY_TYPE_0; // Type of note descriptor
|
||||||
let values = [n_namsz, n_descsz, n_type];
|
let header_values = [n_namsz, n_descsz, n_type];
|
||||||
values.map(|v| data.extend_from_slice(&(v.to_le_bytes())));
|
match endianness {
|
||||||
data.push(b'G'); // Owner of the program property note
|
Endianness::Little => header_values.map(|v| data.extend_from_slice(&(v.to_le_bytes()))),
|
||||||
data.push(b'N');
|
Endianness::Big => header_values.map(|v| data.extend_from_slice(&(v.to_be_bytes()))),
|
||||||
data.push(b'U');
|
};
|
||||||
data.push(0);
|
data.extend_from_slice(b"GNU\0"); // Owner of the program property note
|
||||||
let pr_type: u32 = match architecture {
|
let pr_type: u32 = match architecture {
|
||||||
Architecture::X86_64 => 0xc0000002,
|
Architecture::X86_64 => 0xc0000002,
|
||||||
Architecture::Aarch64 => 0xc0000000,
|
Architecture::Aarch64 => 0xc0000000,
|
||||||
|
@ -128,10 +129,13 @@ fn add_gnu_property_note(
|
||||||
};
|
};
|
||||||
let pr_datasz: u32 = 4; //size of the pr_data field
|
let pr_datasz: u32 = 4; //size of the pr_data field
|
||||||
let pr_data: u32 = 3; //program property descriptor
|
let pr_data: u32 = 3; //program property descriptor
|
||||||
let pr_padding: u32 = 3;
|
let pr_padding: u32 = 0;
|
||||||
let values = [pr_type, pr_datasz, pr_data, pr_padding];
|
let property_values = [pr_type, pr_datasz, pr_data, pr_padding];
|
||||||
values.map(|v| data.extend_from_slice(&(v.to_le_bytes())));
|
match endianness {
|
||||||
file.append_section_data(section, &data, 4);
|
Endianness::Little => property_values.map(|v| data.extend_from_slice(&(v.to_le_bytes()))),
|
||||||
|
Endianness::Big => property_values.map(|v| data.extend_from_slice(&(v.to_be_bytes()))),
|
||||||
|
};
|
||||||
|
file.append_section_data(section, &data, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn create_object_file(sess: &Session) -> Option<write::Object<'static>> {
|
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
|
||||||
_ => elf::ELFOSABI_NONE,
|
_ => elf::ELFOSABI_NONE,
|
||||||
};
|
};
|
||||||
let abi_version = 0;
|
let abi_version = 0;
|
||||||
add_gnu_property_note(&mut file, architecture, binary_format);
|
add_gnu_property_note(&mut file, architecture, binary_format, endianness);
|
||||||
file.flags = FileFlags::Elf { os_abi, abi_version, e_flags };
|
file.flags = FileFlags::Elf { os_abi, abi_version, e_flags };
|
||||||
Some(file)
|
Some(file)
|
||||||
}
|
}
|
||||||
|
|
15
tests/run-make/branch-protection-check-IBT/Makefile
Normal file
15
tests/run-make/branch-protection-check-IBT/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Check for GNU Property Note
|
||||||
|
|
||||||
|
include ../tools.mk
|
||||||
|
|
||||||
|
# How to run this
|
||||||
|
# python3 x.py test --target x86_64-unknown-linux-gnu tests/run-make/branch-protection-check-IBT/
|
||||||
|
|
||||||
|
# only-x86_64
|
||||||
|
|
||||||
|
all:
|
||||||
|
ifeq ($(filter x86,$(LLVM_COMPONENTS)),x86_64)
|
||||||
|
$(RUSTC) --target x86_64-unknown-linux-gnu -Z cf-protection=branch -L$(TMPDIR) -C link-args='-nostartfiles' -C save-temps ./main.rs -o $(TMPDIR)/rsmain
|
||||||
|
readelf -nW $(TMPDIR)/rsmain | $(CGREP) -e ".note.gnu.property"
|
||||||
|
endif
|
||||||
|
|
3
tests/run-make/branch-protection-check-IBT/main.rs
Normal file
3
tests/run-make/branch-protection-check-IBT/main.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
fn main() {
|
||||||
|
println!("hello world");
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue