Skip to content
This repository was archived by the owner on Mar 7, 2021. It is now read-only.

build.rs: Build fixes for Centos 7 #278

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -8,6 +8,6 @@ edition = "2018"
bitflags = "1"

[build-dependencies]
bindgen = "0.54"
bindgen = "0.56"
cc = "1.0"
shlex = "0.1"
27 changes: 25 additions & 2 deletions build.rs
Original file line number Diff line number Diff line change
@@ -53,6 +53,14 @@ const OPAQUE_TYPES: &[&str] = &[
// and https://github.com/rust-lang/rust-bindgen/issues/1538
"desc_struct",
"xregs_state",
"xsave_struct",
];
const CLANG_ARGS_BLACKLIST: [&'static str; 5] = [
"-maccumulate-outgoing-args",
"-mpreferred-stack-boundary=3",
"-mindirect-branch=thunk-extern",
"-mindirect-branch-register",
"-fconserve-stack",
];

fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
@@ -86,10 +94,15 @@ fn handle_kernel_version_cfg(bindings_path: &PathBuf) {
}
if major >= 4 {
// We don't currently support anything older than 4.4
for x in 4..=if major > 4 { 20 } else { minor } {
for x in 1..=if major > 4 { 20 } else { minor } {
println!("cargo:rustc-cfg=kernel_4_{}_0_or_greater", x);
}
}
if major >= 3 {
for x in 1..=if major > 3 { 19 } else { minor } {
println!("cargo:rustc-cfg=kernel_3_{}_0_or_greater", x);
}
}
}

fn handle_kernel_symbols_cfg(symvers_path: &PathBuf) {
@@ -153,6 +166,12 @@ fn main() {

builder = builder.clang_arg(format!("--target={}", target));
for arg in kernel_args.iter() {
if CLANG_ARGS_BLACKLIST.contains(&arg.as_str()) {
continue;
}
if arg.as_str() == "-DOS_CENTOS" {
println!("cargo:rustc-cfg=os_centos")
}
builder = builder.clang_arg(arg.clone());
}

@@ -182,13 +201,17 @@ fn main() {
handle_kernel_symbols_cfg(&PathBuf::from(&kernel_dir).join("Module.symvers"));

let mut builder = cc::Build::new();
builder.compiler(env::var("CC").unwrap_or_else(|_| "clang".to_string()));
let compiler = env::var("CC").unwrap_or_else(|_| "clang".to_string());
builder.compiler(&compiler);
builder.target(&target);
builder.warnings(false);
println!("cargo:rerun-if-changed=src/helpers.c");
builder.file("src/helpers.c");
for arg in kernel_args.iter() {
builder.flag(&arg);
}
if &compiler == "gcc" {
builder.flag("-fno-pie");
}
builder.compile("helpers");
}
2 changes: 1 addition & 1 deletion hello-world/Kbuild
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@ CARGO ?= cargo
export c_flags

$(src)/target/x86_64-linux-kernel/debug/libhello_world.a: cargo_will_determine_dependencies
cd $(src); $(CARGO) build -Z build-std=core,alloc --target=x86_64-linux-kernel
cd $(src); $(CARGO) +nightly build -Z build-std=core,alloc --target=x86_64-linux-kernel

.PHONY: cargo_will_determine_dependencies

13 changes: 12 additions & 1 deletion hello-world/Makefile
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
export KDIR ?= /lib/modules/$(shell uname -r)/build

CONFIG_CC_IS_CLANG := y
CLANG ?= clang
ifeq ($(origin CC),default)
CC := ${CLANG}
endif

HEADER_SEMVER ?= $(shell uname -r | grep -oG "[0-9]\+\.[0-9]\+\.[0-9]\+" | head -1)
ifeq ($(shell echo $(HEADER_SEMVER) 4.4.0 | tr " " "\n" | sort -V | head -1), $(HEADER_SEMVER))
CC := gcc
CONFIG_CC_IS_CLANG := n
endif

ifneq (,$(wildcard /etc/centos-release))
KCPPFLAGS += -DOS_CENTOS
endif

all:
$(MAKE) -C $(KDIR) M=$(CURDIR) CC=$(CC) CONFIG_CC_IS_CLANG=y
$(MAKE) -C $(KDIR) M=$(CURDIR) CC=$(CC) KCPPFLAGS=$(KCPPFLAGS) CONFIG_CC_IS_CLANG=$(CONFIG_CC_IS_CLANG)

clean:
$(MAKE) -C $(KDIR) M=$(CURDIR) CC=$(CC) clean
31 changes: 25 additions & 6 deletions src/file_operations.rs
Original file line number Diff line number Diff line change
@@ -159,19 +159,24 @@ impl<T: FileOperations> FileOperationsVtable<T> {
} else {
None
},

#[cfg(not(kernel_4_1_0_or_greater))]
aio_read: None,
#[cfg(not(kernel_4_1_0_or_greater))]
aio_write: None,
#[cfg(not(kernel_3_11_0_or_greater))]
readdir: None,
#[cfg(not(kernel_4_9_0_or_greater))]
aio_fsync: None,
check_flags: None,
#[cfg(all(kernel_4_5_0_or_greater, not(kernel_4_20_0_or_greater)))]
#[cfg(all(kernel_4_5_0_or_greater, not(kernel_4_20_0_or_greater), not(os_centos)))]
clone_file_range: None,
compat_ioctl: None,
#[cfg(kernel_4_5_0_or_greater)]
copy_file_range: None,
#[cfg(all(kernel_4_5_0_or_greater, not(kernel_4_20_0_or_greater)))]
#[cfg(all(kernel_4_5_0_or_greater, not(kernel_4_20_0_or_greater), not(os_centos)))]
dedupe_file_range: None,
fallocate: None,
#[cfg(kernel_4_19_0_or_greater)]
#[cfg(any(kernel_4_19_0_or_greater, all(os_centos, kernel_4_18_0_or_greater)))]
fadvise: None,
fasync: None,
flock: None,
@@ -181,26 +186,40 @@ impl<T: FileOperations> FileOperationsVtable<T> {
iterate: None,
#[cfg(kernel_4_7_0_or_greater)]
iterate_shared: None,
#[cfg(kernel_5_1_0_or_greater)]
#[cfg(any(kernel_5_1_0_or_greater, all(os_centos, kernel_4_18_0_or_greater)))]
iopoll: None,
lock: None,
mmap: None,
#[cfg(kernel_4_15_0_or_greater)]
mmap_supported_flags: 0,
owner: ptr::null_mut(),
poll: None,
#[cfg(kernel_3_16_0_or_greater)]
read_iter: None,
#[cfg(kernel_4_20_0_or_greater)]
#[cfg(any(kernel_4_20_0_or_greater, all(os_centos, kernel_4_18_0_or_greater)))]
remap_file_range: None,
sendpage: None,
#[cfg(kernel_aufs_setfl)]
setfl: None,
#[cfg(all(not(kernel_4_18_0_or_greater), os_centos))]
__bindgen_anon_1: bindings::file_operations__bindgen_ty_1 { setlease: None },
#[cfg(any(kernel_4_18_0_or_greater, not(os_centos)))]
setlease: None,
show_fdinfo: None,
splice_read: None,
splice_write: None,
unlocked_ioctl: None,
#[cfg(kernel_3_16_0_or_greater)]
write_iter: None,

#[cfg(all(os_centos, kernel_4_18_0_or_greater))]
rh_reserved1: 0,
#[cfg(all(os_centos, kernel_4_18_0_or_greater))]
rh_reserved2: 0,
#[cfg(all(os_centos, kernel_4_18_0_or_greater))]
rh_reserved3: 0,
#[cfg(all(os_centos, kernel_4_18_0_or_greater))]
rh_reserved4: 0,
};
}

5 changes: 3 additions & 2 deletions src/helpers.c
Original file line number Diff line number Diff line change
@@ -3,15 +3,16 @@
#include <linux/uaccess.h>
#include <linux/version.h>


void bug_helper(void)
{
BUG();
}

int access_ok_helper(const void __user *addr, unsigned long n)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) /* v5.0-rc1~46 */
#if defined(OS_CENTOS) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0)
return access_ok(addr, n);
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) /* v5.0-rc1~46 */
return access_ok(addr, n);
#else
return access_ok(0, addr, n);