簡體   English   中英

如何用用戶定義的函數覆蓋 C lib 函數,如 _sbrk?

[英]How to override C lib functions like _sbrk with user-defined one?

我想在由newlib提供的 RISCV 上的 C 和 C++ 中使用 STL 函數。 為了使用這些,我必須替換_sbrk_read_write和其他一些函數的默認實現。 默認情況下, newlib提供這些函數,它們使用syscallsecall指令使用系統調用。 但是,我不想實現ecall指令,而是為它們提供新功能。

問題是我不知道如何替換 C 和 C++ 中的 function。 所以我的問題基本上是,如何在 C/C++ 中覆蓋 function? 特別是_sbrk和其他syscall函數。

注意:因為我沒有 RiscV 的交叉編譯器,所以這個例子使用malloc()而不是_sbrk() 原理是一樣的。

  1. 自己實現這些功能。

     #include <stdlib.h> void* malloc(size_t size) { (void)size; return NULL; }
  2. 然后將該模塊鏈接到您的其他模塊,這些功能將不會從庫中獲取。

    假設我們有這個簡單的程序:

     #include <stdio.h> #include <stdlib.h> int main() { printf("%p\n", malloc(23)); return 0; }

    這就是我編譯和鏈接的方式:

     gcc -Wall -Wextra -pedantic -g -c main.c -o main.o gcc -Wall -Wextra -pedantic -g -c malloc.c -o malloc.o gcc -Wall -Wextra main.o malloc.o -g -Wl,-Map=my_own.map -o my_own

生成的 map 文件並不簡單,但是,這些是相關行:

[--- lines cut ---]

 .plt           0x0000000000001020       0x20 /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../lib/Scrt1.o
                0x0000000000001030                printf@@GLIBC_2.2.5
 *(.iplt)

[--- lines cut ---]

 .text          0x0000000000001040       0x2f /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../lib/Scrt1.o
                0x0000000000001040                _start
 .text          0x000000000000106f        0x0 /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/../../../../lib/crti.o
 *fill*         0x000000000000106f        0x1 
 .text          0x0000000000001070       0xc9 /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/crtbeginS.o
 .text          0x0000000000001139       0x29 main.o
                0x0000000000001139                main
 .text          0x0000000000001162        0xf malloc.o
                0x0000000000001162                malloc

[--- lines cut ---]

如圖所示, printf()取自庫,但使用了我自己的malloc()

這就是您所需要的: https://github.com/openhwgroup/cv32e40p/blob/master/example_tb/core/custom/syscalls.c所有必需的系統調用都在那里,malloc() 使用此tub 函數功能齊全...假設 UART 位於 0x10000000(使用 qemu-system-riscv32 -machine virt 測試),其他類似 printf() 的東西也可以工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM