關於C語言, GCC MSVC中,如何寫出乙個真正意義上的不依賴庫的程式?

時間 2021-05-06 21:09:07

1樓:

很多微控制器程式是不依賴庫的,它們會有中斷呼叫。很多微控制器的編譯器是用GCC。既然問題又提到MSVC,就意味著Windows程式,不依賴庫是不行的,因為作業系統已經將軟硬體隔離,任何呼叫都需要經過作業系統一層,可以寫出看不到依賴庫的程式(方法是從 Process Envirorment Block Structure 切入獲取庫函式),但那只是看不到,其實最終還是載入庫並呼叫庫中函式。

2樓:Belleve

這不就是給裸機程式設計嗎?翻硬體規格然後操縱特定的 IO 埠 / 記憶體位址 / ……

對於較為常見的硬體架構(如 x86 、ARM 等),gcc 或者 msvc 都有對應的裸機工具支援。

ps. 早年的遊戲機開發其實也是這樣,FC、C64 的商業遊戲開發,都是手寫彙編去擺弄硬體

3樓:康光宇

還沒看其他回答。嵌入式系統的bootloader可以說是真的不依賴庫的程式。這樣的程式其實一般也有彙編的start.

s,crt0.c之類的東西來形成程式的入口,SOC要麼內部固化一段片內bootloader,要麼更早的系統有把CPU位址直接對映到'nor flash某處的,上電後就開始執行。程式內部都含有簡單的c庫實現。

連線指令碼是特殊的。當然,這東西可能不能算是真正的『程式』,但是能被操做系統裝載和執行的程式,沒必要也基本不可能不依賴庫。

4樓:Dedicitha Lin

只要你是在win或linux這種環境下就不可能寫出真正不依賴庫的程式,因為最終還是要呼叫作業系統介面跟硬體通訊。唯一可能的情況,你用純暫存器實現硬體io呼叫顯示,寫到主機板的啟動rom裡…這時候要參考主機板設計和各種ic的資料手冊,完事了你就能寫出乙個不依賴庫的…hello world

5樓:開神刀

MSVC的解決方案:

link.exe /NODEFAULTLIB /ENTRY:kmain /NOLOGO /SUBSYSTEM:

CONSOLE /BASE:0xFFFFF90000000000 /RELEASE /MACHINE:X64 /OUT:

kernel.exe *.obj

重點是NODEFAULTLIB引數,這個可以保證沒有依賴庫,當然浮點數啥的也就別想直接用了。

但是這樣的程式很明顯是沒法直接執行的,需要外部的一些支援程式的幫助。

6樓:「已登出」

xxd -r eb fe……可惜這是一段純二進位制,需要翻譯成平台對應的可執行檔案格式。

以及可惜這個只能工作在x86-16/32/64平台(咦這麼說的話還挺……)

7樓:dodolang

如果僅限定x86平台的話,首先你要明白bare metal能夠執行,依賴於一些約定,你要清楚這些約定,然後用一部分彙編,一部分c寫乙個能用的bootloader。

8樓:

在數位電路課程實驗裡實現了一套基於 RISC-V 的計算機系統,其中有乙個可由 gcc 編譯的簡易系統,不依賴任何庫。

部分 Makefile 檔案:

CFLAGS

:= -nostdinc -fno-stack-protector -fno-builtin -static -Ttext=0x00000 -march=rv32im -mabi=ilp32 -nostdlib

CFILES

:= boot.S main.c

CFILES

+=$(shell find ! -name "main.c" -name "*.c"

)boot.S 檔案是啟動檔案,完成程式位址空間的初始化,類似 crt0/1

.section

.text

.globl

_start

_start:li

sp,0x7fff0

ligp

,0x70000

jmain

Emmm-HAck3r5/EmmmCS

關於新手學習c語言?

1.Turbo C for Windows 整合實驗與學習環境V6.0 整合實驗與學習環境是從事一線教學的大學教師團隊根據C語言初學者的特點,量身定製的乙個簡單易用的C語言實驗與學習軟體,它具有錯誤資訊自動定位 中英文編譯錯誤資訊同步顯示 除錯邏輯錯誤 關鍵字實時幫助 語法著色 無限次撤消與恢復 W...

C語言 關於C裡面陣列批量初始化

蛋蛋的蛋 int a 1000 補充一下,類似的方式可以讓前500個元素等於1,後500個等於0,手機打字,不方便,有心人自己嘗試吧, 向晨 c標準庫有個limits.h的標頭檔案,裡面有你所使用機器的int char等型別變數的位元組長度和大小限制相關的巨集,可以用這些巨集來知道乙個int對應幾個...

關於c語言的malloc 0xffffffff 的乙個問題???

千年放浪 如 李洋 所說,我在64位機上看到的語法樹解析完的結果如下 sizeof size t 是8。1其實轉換成了 1ull。 malloc的引數是無符號整數size t型別,所以你用0xffffffff做引數,就會預設是正整數,而 1做引數,就會導致錯誤。還有,malloc返回值要顯式轉化,不...