readme

来自「klibc精简化的c程序库」· 代码 · 共 82 行

TXT
82
字号
To port klibc to a new architecture, you need:a) A directory structureEach archtecture has a klibc/arch/ directory, which should include anMCONFIG and a Makefile.inc file, and an include/arch/ directory, whichincludes some architecture-specific header files, includingklibc/archconfig.h.b) Architecture-specific configuration   (include/arch/*/klibc/sysconfig.h)This file can set configuration variables frominclude/klibc/sysconfig.h.c) Startup code   (klibc/arch/*/crt0.S)The crt0.S assembly routine typically corresponds to the followingpseudo-C code.  In addition, each architecture needs any supportroutines that gcc-generated code expects to find in the system library-- Alpha, for example, needs divide subroutines.The "getenvtest" test program is a very good test for proper crt0.Sfunctionality.extern __noreturn __libc_init(void *, void *);__noreturn _start(void){  void *elf_data   = get_elf_data_address(); /* Usually the stack address */  void *atexit_ptr = get_atexit_ptr();       /* Usually in a register */  /* Some architectures need this for debugging to work */  setup_null_stack_frame_if_necessary();  __libc_init(elf_data, atexit_ptr);}d) A setenv implementation   (klibc/arch/*/setjmp.S, include/arch/*klibc/archsetjmp.h)On most (but not all!) architectures, this entails creating a setjmpbuffer big enough to hold all callee-saved registers, plus the stackpointer and the return address.  In setjmp.S you have:* A "setjmp" function that writes out the callee-saved registers, the  stack pointer and the return address to the buffer pointed to by the  first argument, and then returns zero normally.  On some architectures you need to take some kind of action to make  sure the contents of the stack is actually manifest in memory and  not cached in the CPU.  In some cases (e.g. on SPARC) this will  automatically spill the registers onto the stack; then they don't  need to be spilled into the jmp_buf.* A "longjmp" function that read back these same registers from the  jmp_buf pointed to by the first argument, and returns the second  argument *to the address specified in the jmp_buf*.  On some architectures you need to take some kind of action to flush  any cached stack data or return stack.e) Any support functions needed by gcc, *unless* they are in libgcc  *and* libgcc is usable for klibc on your particular platform.  If  libgcc isn't usable for klibc (on MIPS, for example, libgcc is  compiled in a way that is not compatible with klibc) there are  reasonably good clones of most of the libgcc functions in the libgcc  directory.  To use them, add them to ARCHOBJS in  klibc/arch/*/Makefile.inc.f) A link location for the shared klibc.  This should be specified in  SHAREDFLAGS in klibc/arch/*/MCONFIG.  This is not applicable to no-MMU architectures.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?