diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 5bc89674..31db8592 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -4,7 +4,8 @@ "name": "DragonOS", "includePath": [ "${workspaceFolder}/**", - "${workspaceFolder}/user/libs/libc/src/include" + "${workspaceFolder}/user/libs/libc/src/include", + "${workspaceFolder}/user/libs/libc/src/include/export" ], "defines": [ "__x86_64__", diff --git a/user/Makefile b/user/Makefile index 0ef1a11a..60970dfd 100644 --- a/user/Makefile +++ b/user/Makefile @@ -9,7 +9,7 @@ GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS))) tmp_output_dir=$(ROOT_PATH)/bin/tmp/user output_dir=$(ROOT_PATH)/bin/user -CFLAGS := $(GLOBAL_CFLAGS) -I $(shell pwd)/libs -I $(shell pwd)/libs/libc/src/include +CFLAGS := $(GLOBAL_CFLAGS) -I $(shell pwd)/libs -I $(shell pwd)/libs/libc/src/include -I $(shell pwd)/libs/libc/src/include/export current_CFLAGS := $(CFLAGS) ECHO: @@ -44,9 +44,14 @@ sys_api_lib_stage_1: make_output_dir sys_api_lib: sys_api_lib_stage_1 - $(AR) crvs $(ROOT_PATH)/bin/sysroot/usr/lib/libc.a $(shell find ./libs/* -name "*.o") - $(shell find ./libs/* -name "*.o" | xargs -I {} cp {} $(ROOT_PATH)/bin/sysroot/usr/lib/) - $(shell cp -r $(ROOT_PATH)/user/libs/libc/src/include/* $(ROOT_PATH)/bin/sysroot/usr/include/) + +# 打包系统库 + mkdir -p $(ROOT_PATH)/bin/tmp/user/sys_api_lib_build_tmp + $(AR) x $(ROOT_PATH)/user/libs/libc/target/x86_64-unknown-none/release/liblibc.a --output=$(ROOT_PATH)/bin/tmp/user/sys_api_lib_build_tmp + $(AR) crvs $(ROOT_PATH)/bin/sysroot/usr/lib/libc.a $(shell find ./libs/* -name "*.o") $(shell find $(ROOT_PATH)/bin/tmp/user/sys_api_lib_build_tmp/* -name "*.o") + rm -rf $(ROOT_PATH)/bin/tmp/user/sys_api_lib_build_tmp +# $(shell find ./libs/* -name "*.o" | xargs -I {} cp {} $(ROOT_PATH)/bin/sysroot/usr/lib/) + $(shell cp -r $(ROOT_PATH)/user/libs/libc/src/include/export/* $(ROOT_PATH)/bin/sysroot/usr/include/) $(shell cp -r $(ROOT_PATH)/user/libs/libc/src/arch/x86_64/c*.o $(ROOT_PATH)/bin/sysroot/usr/lib/) clean: diff --git a/user/apps/about/Makefile b/user/apps/about/Makefile index e6d9eb4b..82c20612 100644 --- a/user/apps/about/Makefile +++ b/user/apps/about/Makefile @@ -3,7 +3,7 @@ GIT_COMMIT_SHA1=$(shell git log -n 1 | head -n 1 | cut -d ' ' -f 2 | cut -c1-8) all: about.o - $(LD) -b elf64-x86-64 -z muldefs -o $(tmp_output_dir)/about $(shell find . -name "*.o") $(shell find $(sys_libs_dir) -name "*.o") -T about.lds + $(LD) -b elf64-x86-64 -z muldefs -o $(tmp_output_dir)/about $(shell find . -name "*.o") $(ROOT_PATH)/bin/sysroot/usr/lib/libc.a -T about.lds $(OBJCOPY) -I elf64-x86-64 -R ".eh_frame" -R ".comment" -O elf64-x86-64 $(tmp_output_dir)/about $(output_dir)/about.elf diff --git a/user/apps/about/about.lds b/user/apps/about/about.lds index c9f7f159..6634d5e7 100644 --- a/user/apps/about/about.lds +++ b/user/apps/about/about.lds @@ -14,6 +14,7 @@ SECTIONS _text = .; *(.text) + *(.text.*) _etext = .; } @@ -23,6 +24,7 @@ SECTIONS { _data = .; *(.data) + *(.data.*) _edata = .; } @@ -33,6 +35,7 @@ SECTIONS { _rodata = .; *(.rodata) + *(.rodata.*) _erodata = .; } @@ -41,6 +44,7 @@ SECTIONS { _bss = .; *(.bss) + *(.bss.*) _ebss = .; } diff --git a/user/apps/shell/Makefile b/user/apps/shell/Makefile index 2d6f4b90..e0bafe82 100644 --- a/user/apps/shell/Makefile +++ b/user/apps/shell/Makefile @@ -1,6 +1,6 @@ all: shell.o cmd.o cmd_help.o cmd_test.o - $(LD) -b elf64-x86-64 -z muldefs -o $(tmp_output_dir)/shell $(shell find . -name "*.o") $(shell find $(sys_libs_dir) -name "*.o") -T shell.lds + $(LD) -b elf64-x86-64 -z muldefs -o $(tmp_output_dir)/shell $(shell find . -name "*.o") $(ROOT_PATH)/bin/sysroot/usr/lib/libc.a -T shell.lds $(OBJCOPY) -I elf64-x86-64 -R ".eh_frame" -R ".comment" -O elf64-x86-64 $(tmp_output_dir)/shell $(output_dir)/shell.elf shell.o: shell.c diff --git a/user/apps/shell/shell.lds b/user/apps/shell/shell.lds index c9f7f159..6634d5e7 100644 --- a/user/apps/shell/shell.lds +++ b/user/apps/shell/shell.lds @@ -14,6 +14,7 @@ SECTIONS _text = .; *(.text) + *(.text.*) _etext = .; } @@ -23,6 +24,7 @@ SECTIONS { _data = .; *(.data) + *(.data.*) _edata = .; } @@ -33,6 +35,7 @@ SECTIONS { _rodata = .; *(.rodata) + *(.rodata.*) _erodata = .; } @@ -41,6 +44,7 @@ SECTIONS { _bss = .; *(.bss) + *(.bss.*) _ebss = .; } diff --git a/user/apps/test_signal/Makefile b/user/apps/test_signal/Makefile index 4d2d19f2..6c33c241 100644 --- a/user/apps/test_signal/Makefile +++ b/user/apps/test_signal/Makefile @@ -1,6 +1,6 @@ all: main.o - $(LD) -b elf64-x86-64 -z muldefs -o $(tmp_output_dir)/test_signal $(shell find . -name "*.o") $(shell find $(sys_libs_dir) -name "*.o") -T link.lds + $(LD) -b elf64-x86-64 -z muldefs -o $(tmp_output_dir)/test_signal $(shell find . -name "*.o") $(ROOT_PATH)/bin/sysroot/usr/lib/libc.a -T link.lds $(OBJCOPY) -I elf64-x86-64 -R ".eh_frame" -R ".comment" -O elf64-x86-64 $(tmp_output_dir)/test_signal $(output_dir)/test_signal.elf main.o: main.c diff --git a/user/apps/test_signal/link.lds b/user/apps/test_signal/link.lds index c9f7f159..6634d5e7 100644 --- a/user/apps/test_signal/link.lds +++ b/user/apps/test_signal/link.lds @@ -14,6 +14,7 @@ SECTIONS _text = .; *(.text) + *(.text.*) _etext = .; } @@ -23,6 +24,7 @@ SECTIONS { _data = .; *(.data) + *(.data.*) _edata = .; } @@ -33,6 +35,7 @@ SECTIONS { _rodata = .; *(.rodata) + *(.rodata.*) _erodata = .; } @@ -41,6 +44,7 @@ SECTIONS { _bss = .; *(.bss) + *(.bss.*) _ebss = .; } diff --git a/user/libs/libc/build.rs b/user/libs/libc/build.rs new file mode 100644 index 00000000..6930e321 --- /dev/null +++ b/user/libs/libc/build.rs @@ -0,0 +1,45 @@ +extern crate bindgen; +// use ::std::env; + +use std::path::PathBuf; + +fn main() { + // Tell cargo to look for shared libraries in the specified directory + println!("cargo:rustc-link-search=src"); + println!("cargo:rerun-if-changed=src/include/internal/bindings/wrapper.h"); + + // let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + let out_path = PathBuf::from(String::from("src/include/internal/bindings/")); + + // The bindgen::Builder is the main entry point + // to bindgen, and lets you build up options for + // the resulting bindings. + { + let bindings = bindgen::Builder::default() + .clang_arg("-I./src/include") + .clang_arg("-I./src/include/export") // todo: 当引入多种架构之后,需要修改这里,对于不同的架构编译时,include不同的路径 + // The input header we would like to generate + // bindings for. + .header("src/include/internal/bindings/wrapper.h") + .clang_arg("--target=x86_64-none-none") + .clang_arg("-v") + // 使用core,并将c语言的类型改为core::ffi,而不是使用std库。 + .use_core() + .ctypes_prefix("::core::ffi") + .generate_inline_functions(true) + .raw_line("#![allow(dead_code)]") + .raw_line("#![allow(non_upper_case_globals)]") + .raw_line("#![allow(non_camel_case_types)]") + // Tell cargo to invalidate the built crate whenever any of the + // included header files changed. + .parse_callbacks(Box::new(bindgen::CargoCallbacks)) + // Finish the builder and generate the bindings. + .generate() + // Unwrap the Result and panic on failure. + .expect("Unable to generate bindings"); + + bindings + .write_to_file(out_path.join("bindings.rs")) + .expect("Couldn't write bindings!"); + } +} \ No newline at end of file diff --git a/user/libs/libc/src/Makefile b/user/libs/libc/src/Makefile index 60ab5099..8131f4e2 100644 --- a/user/libs/libc/src/Makefile +++ b/user/libs/libc/src/Makefile @@ -36,4 +36,4 @@ libc: $(libc_objs) $(libc_sub_dirs) libc_rust libc_rust: rustup default nightly - cargo +nightly build --release --target ./x86_64-unknown-none.json \ No newline at end of file + cargo +nightly build --release --target ./arch/x86_64/x86_64-unknown-none.json \ No newline at end of file diff --git a/user/libs/libc/src/x86_64-unknown-none.json b/user/libs/libc/src/arch/x86_64/x86_64-unknown-none.json similarity index 100% rename from user/libs/libc/src/x86_64-unknown-none.json rename to user/libs/libc/src/arch/x86_64/x86_64-unknown-none.json diff --git a/user/libs/libc/src/include/__libc__.h b/user/libs/libc/src/include/export/__libc__.h similarity index 100% rename from user/libs/libc/src/include/__libc__.h rename to user/libs/libc/src/include/export/__libc__.h diff --git a/user/libs/libc/src/include/ctype.h b/user/libs/libc/src/include/export/ctype.h similarity index 100% rename from user/libs/libc/src/include/ctype.h rename to user/libs/libc/src/include/export/ctype.h diff --git a/user/libs/libc/src/include/dirent.h b/user/libs/libc/src/include/export/dirent.h similarity index 100% rename from user/libs/libc/src/include/dirent.h rename to user/libs/libc/src/include/export/dirent.h diff --git a/user/libs/libc/src/include/errno.h b/user/libs/libc/src/include/export/errno.h similarity index 100% rename from user/libs/libc/src/include/errno.h rename to user/libs/libc/src/include/export/errno.h diff --git a/user/libs/libc/src/include/fcntl.h b/user/libs/libc/src/include/export/fcntl.h similarity index 100% rename from user/libs/libc/src/include/fcntl.h rename to user/libs/libc/src/include/export/fcntl.h diff --git a/user/libs/libc/src/include/libm.h b/user/libs/libc/src/include/export/libm.h similarity index 100% rename from user/libs/libc/src/include/libm.h rename to user/libs/libc/src/include/export/libm.h diff --git a/user/libs/libc/src/include/math.h b/user/libs/libc/src/include/export/math.h similarity index 100% rename from user/libs/libc/src/include/math.h rename to user/libs/libc/src/include/export/math.h diff --git a/user/libs/libc/src/include/printf.h b/user/libs/libc/src/include/export/printf.h similarity index 100% rename from user/libs/libc/src/include/printf.h rename to user/libs/libc/src/include/export/printf.h diff --git a/user/libs/libc/src/include/signal.h b/user/libs/libc/src/include/export/signal.h similarity index 100% rename from user/libs/libc/src/include/signal.h rename to user/libs/libc/src/include/export/signal.h diff --git a/user/libs/libc/src/include/stddef.h b/user/libs/libc/src/include/export/stddef.h similarity index 100% rename from user/libs/libc/src/include/stddef.h rename to user/libs/libc/src/include/export/stddef.h diff --git a/user/libs/libc/src/include/stdint.h b/user/libs/libc/src/include/export/stdint.h similarity index 100% rename from user/libs/libc/src/include/stdint.h rename to user/libs/libc/src/include/export/stdint.h diff --git a/user/libs/libc/src/include/stdio.h b/user/libs/libc/src/include/export/stdio.h similarity index 100% rename from user/libs/libc/src/include/stdio.h rename to user/libs/libc/src/include/export/stdio.h diff --git a/user/libs/libc/src/include/stdlib.h b/user/libs/libc/src/include/export/stdlib.h similarity index 100% rename from user/libs/libc/src/include/stdlib.h rename to user/libs/libc/src/include/export/stdlib.h diff --git a/user/libs/libc/src/include/string.h b/user/libs/libc/src/include/export/string.h similarity index 100% rename from user/libs/libc/src/include/string.h rename to user/libs/libc/src/include/export/string.h diff --git a/user/libs/libc/src/include/sys/stat.h b/user/libs/libc/src/include/export/sys/stat.h similarity index 100% rename from user/libs/libc/src/include/sys/stat.h rename to user/libs/libc/src/include/export/sys/stat.h diff --git a/user/libs/libc/src/include/sys/types.h b/user/libs/libc/src/include/export/sys/types.h similarity index 100% rename from user/libs/libc/src/include/sys/types.h rename to user/libs/libc/src/include/export/sys/types.h diff --git a/user/libs/libc/src/include/sys/wait.h b/user/libs/libc/src/include/export/sys/wait.h similarity index 100% rename from user/libs/libc/src/include/sys/wait.h rename to user/libs/libc/src/include/export/sys/wait.h diff --git a/user/libs/libc/src/include/time.h b/user/libs/libc/src/include/export/time.h similarity index 100% rename from user/libs/libc/src/include/time.h rename to user/libs/libc/src/include/export/time.h diff --git a/user/libs/libc/src/include/unistd.h b/user/libs/libc/src/include/export/unistd.h similarity index 100% rename from user/libs/libc/src/include/unistd.h rename to user/libs/libc/src/include/export/unistd.h diff --git a/user/libs/libc/src/include/internal/bindings/.gitignore b/user/libs/libc/src/include/internal/bindings/.gitignore new file mode 100644 index 00000000..84dc93d4 --- /dev/null +++ b/user/libs/libc/src/include/internal/bindings/.gitignore @@ -0,0 +1 @@ +bindings.rs \ No newline at end of file diff --git a/user/libs/libc/src/include/internal/bindings/mod.rs b/user/libs/libc/src/include/internal/bindings/mod.rs new file mode 100644 index 00000000..44946577 --- /dev/null +++ b/user/libs/libc/src/include/internal/bindings/mod.rs @@ -0,0 +1 @@ +pub mod bindings; \ No newline at end of file diff --git a/user/libs/libc/src/include/internal/bindings/wrapper.h b/user/libs/libc/src/include/internal/bindings/wrapper.h new file mode 100644 index 00000000..08c4d3db --- /dev/null +++ b/user/libs/libc/src/include/internal/bindings/wrapper.h @@ -0,0 +1,15 @@ +/** + * @file wrapper.h + * @author longjin (longjin@RinGoTek.cn) + * @brief 这是为libc的C代码的相关接口创建rust绑定的wrapper + * @version 0.1 + * @date 2023-02-11 + * + * @copyright Copyright (c) 2023 + * + */ +#pragma once + +// 这里导出在include/export文件夹下的头文件 +#include +#include \ No newline at end of file diff --git a/user/libs/libc/src/include/internal/mod.rs b/user/libs/libc/src/include/internal/mod.rs new file mode 100644 index 00000000..44946577 --- /dev/null +++ b/user/libs/libc/src/include/internal/mod.rs @@ -0,0 +1 @@ +pub mod bindings; \ No newline at end of file diff --git a/user/libs/libc/src/include/mod.rs b/user/libs/libc/src/include/mod.rs new file mode 100644 index 00000000..069bb86b --- /dev/null +++ b/user/libs/libc/src/include/mod.rs @@ -0,0 +1 @@ +pub mod internal; \ No newline at end of file diff --git a/user/libs/libc/src/lib.rs b/user/libs/libc/src/lib.rs index e0557366..d7c44679 100644 --- a/user/libs/libc/src/lib.rs +++ b/user/libs/libc/src/lib.rs @@ -7,9 +7,12 @@ #[allow(non_upper_case_globals)] #[allow(non_camel_case_types)] #[allow(non_snake_case)] - - use core::panic::PanicInfo; + +use include::internal::bindings::bindings::putchar; + +mod include; + #[panic_handler] fn panic(_info: &PanicInfo) -> ! { loop {} @@ -17,5 +20,9 @@ fn panic(_info: &PanicInfo) -> ! { #[no_mangle] pub extern "C" fn scanf() { - + loop { + unsafe { + putchar(88); + } + } }