Browse Source

修改libc的编译相关内容(#171)

1.将libc的include文件夹分为export和internal
2.将所有app都直接链接libc.a,而不是都执行一遍"搜索.o"的过程
login 2 years ago
parent
commit
2bf5ee0e3c
36 changed files with 100 additions and 11 deletions
  1. 2 1
      .vscode/c_cpp_properties.json
  2. 9 4
      user/Makefile
  3. 1 1
      user/apps/about/Makefile
  4. 4 0
      user/apps/about/about.lds
  5. 1 1
      user/apps/shell/Makefile
  6. 4 0
      user/apps/shell/shell.lds
  7. 1 1
      user/apps/test_signal/Makefile
  8. 4 0
      user/apps/test_signal/link.lds
  9. 45 0
      user/libs/libc/build.rs
  10. 1 1
      user/libs/libc/src/Makefile
  11. 0 0
      user/libs/libc/src/arch/x86_64/x86_64-unknown-none.json
  12. 0 0
      user/libs/libc/src/include/export/__libc__.h
  13. 0 0
      user/libs/libc/src/include/export/ctype.h
  14. 0 0
      user/libs/libc/src/include/export/dirent.h
  15. 0 0
      user/libs/libc/src/include/export/errno.h
  16. 0 0
      user/libs/libc/src/include/export/fcntl.h
  17. 0 0
      user/libs/libc/src/include/export/libm.h
  18. 0 0
      user/libs/libc/src/include/export/math.h
  19. 0 0
      user/libs/libc/src/include/export/printf.h
  20. 0 0
      user/libs/libc/src/include/export/signal.h
  21. 0 0
      user/libs/libc/src/include/export/stddef.h
  22. 0 0
      user/libs/libc/src/include/export/stdint.h
  23. 0 0
      user/libs/libc/src/include/export/stdio.h
  24. 0 0
      user/libs/libc/src/include/export/stdlib.h
  25. 0 0
      user/libs/libc/src/include/export/string.h
  26. 0 0
      user/libs/libc/src/include/export/sys/stat.h
  27. 0 0
      user/libs/libc/src/include/export/sys/types.h
  28. 0 0
      user/libs/libc/src/include/export/sys/wait.h
  29. 0 0
      user/libs/libc/src/include/export/time.h
  30. 0 0
      user/libs/libc/src/include/export/unistd.h
  31. 1 0
      user/libs/libc/src/include/internal/bindings/.gitignore
  32. 1 0
      user/libs/libc/src/include/internal/bindings/mod.rs
  33. 15 0
      user/libs/libc/src/include/internal/bindings/wrapper.h
  34. 1 0
      user/libs/libc/src/include/internal/mod.rs
  35. 1 0
      user/libs/libc/src/include/mod.rs
  36. 9 2
      user/libs/libc/src/lib.rs

+ 2 - 1
.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__",

+ 9 - 4
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: 

+ 1 - 1
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
 

+ 4 - 0
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 = .;
 	}
 

+ 1 - 1
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

+ 4 - 0
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 = .;
 	}
 

+ 1 - 1
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

+ 4 - 0
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 = .;
 	}
 

+ 45 - 0
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!");
+    }
+}

+ 1 - 1
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
+	cargo +nightly build --release --target ./arch/x86_64/x86_64-unknown-none.json

+ 0 - 0
user/libs/libc/src/x86_64-unknown-none.json → user/libs/libc/src/arch/x86_64/x86_64-unknown-none.json


+ 0 - 0
user/libs/libc/src/include/__libc__.h → user/libs/libc/src/include/export/__libc__.h


+ 0 - 0
user/libs/libc/src/include/ctype.h → user/libs/libc/src/include/export/ctype.h


+ 0 - 0
user/libs/libc/src/include/dirent.h → user/libs/libc/src/include/export/dirent.h


+ 0 - 0
user/libs/libc/src/include/errno.h → user/libs/libc/src/include/export/errno.h


+ 0 - 0
user/libs/libc/src/include/fcntl.h → user/libs/libc/src/include/export/fcntl.h


+ 0 - 0
user/libs/libc/src/include/libm.h → user/libs/libc/src/include/export/libm.h


+ 0 - 0
user/libs/libc/src/include/math.h → user/libs/libc/src/include/export/math.h


+ 0 - 0
user/libs/libc/src/include/printf.h → user/libs/libc/src/include/export/printf.h


+ 0 - 0
user/libs/libc/src/include/signal.h → user/libs/libc/src/include/export/signal.h


+ 0 - 0
user/libs/libc/src/include/stddef.h → user/libs/libc/src/include/export/stddef.h


+ 0 - 0
user/libs/libc/src/include/stdint.h → user/libs/libc/src/include/export/stdint.h


+ 0 - 0
user/libs/libc/src/include/stdio.h → user/libs/libc/src/include/export/stdio.h


+ 0 - 0
user/libs/libc/src/include/stdlib.h → user/libs/libc/src/include/export/stdlib.h


+ 0 - 0
user/libs/libc/src/include/string.h → user/libs/libc/src/include/export/string.h


+ 0 - 0
user/libs/libc/src/include/sys/stat.h → user/libs/libc/src/include/export/sys/stat.h


+ 0 - 0
user/libs/libc/src/include/sys/types.h → user/libs/libc/src/include/export/sys/types.h


+ 0 - 0
user/libs/libc/src/include/sys/wait.h → user/libs/libc/src/include/export/sys/wait.h


+ 0 - 0
user/libs/libc/src/include/time.h → user/libs/libc/src/include/export/time.h


+ 0 - 0
user/libs/libc/src/include/unistd.h → user/libs/libc/src/include/export/unistd.h


+ 1 - 0
user/libs/libc/src/include/internal/bindings/.gitignore

@@ -0,0 +1 @@
+bindings.rs

+ 1 - 0
user/libs/libc/src/include/internal/bindings/mod.rs

@@ -0,0 +1 @@
+pub mod bindings;

+ 15 - 0
user/libs/libc/src/include/internal/bindings/wrapper.h

@@ -0,0 +1,15 @@
+/**
+ * @file wrapper.h
+ * @author longjin ([email protected])
+ * @brief 这是为libc的C代码的相关接口创建rust绑定的wrapper
+ * @version 0.1
+ * @date 2023-02-11
+ *
+ * @copyright Copyright (c) 2023
+ *
+ */
+#pragma once
+
+// 这里导出在include/export文件夹下的头文件
+#include <stdio.h>
+#include <unistd.h>

+ 1 - 0
user/libs/libc/src/include/internal/mod.rs

@@ -0,0 +1 @@
+pub mod bindings;

+ 1 - 0
user/libs/libc/src/include/mod.rs

@@ -0,0 +1 @@
+pub mod internal;

+ 9 - 2
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;
 
-use core::panic::PanicInfo;
 #[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);
+        }
+    }
 }