三個問題
了解Hello World程序的執(zhí)行過程有什么用?
編譯和執(zhí)行:Hello World程序的執(zhí)行分為兩個主要步驟:編譯和執(zhí)行。編譯器將源代碼轉(zhuǎn)換為可執(zhí)行文件,然后計算機(jī)執(zhí)行該文件并輸出相應(yīng)的結(jié)果。了解這個過程可以幫助我們理解如何將代碼轉(zhuǎn)化為可運(yùn)行的程序。
語法和語義:Hello World程序是一個簡單的示例,它包含一些基本的語法和語義規(guī)則。通過學(xué)習(xí)Hello World程序的執(zhí)行過程,我們可以了解如何正確使用編程語言的關(guān)鍵字、標(biāo)識符、語句和表達(dá)式,以及它們在程序中的作用。
調(diào)試和錯誤處理:當(dāng)我們編寫代碼時,經(jīng)常會出現(xiàn)錯誤。了解Hello World程序的執(zhí)行過程可以幫助我們更好地理解和調(diào)試代碼中的錯誤。我們可以學(xué)習(xí)如何查找和修復(fù)常見的語法錯誤和邏輯錯誤,并提高代碼的質(zhì)量和可靠性。
程序輸出和交互:Hello World程序的執(zhí)行結(jié)果通常是在終端或命令行中輸出一段文本。這可以幫助我們理解程序如何與用戶進(jìn)行交互,并將結(jié)果展示給用戶。了解這個過程對于開發(fā)復(fù)雜的應(yīng)用程序和用戶界面是很重要的。
裸機(jī)開發(fā)中的HelloWorld程序是怎么執(zhí)行的?
第一步;進(jìn)行源代碼的編寫,其中關(guān)鍵的點(diǎn)在于printf函數(shù)的實現(xiàn),它需要依賴單片機(jī)的串口驅(qū)動程序。
第二步: 借助一些集成開發(fā)環(huán)境進(jìn)行程序的編譯。一鍵編譯,無需學(xué)習(xí)編譯鏈接相關(guān)知識。
第三步: 借助燒錄工具燒錄到具體芯片上。一鍵燒錄,無需學(xué)習(xí)芯片的flash和各種各樣啟動方式。
第四步: 上電啟動開發(fā)板,串口輸出“Hello World”字符串。
Linux系統(tǒng)下的Hello World程序是怎么執(zhí)行的?
四個案例
gcc預(yù)處理c文件
COLLECT_GCC_OPTIONS='-E' '-o' 'hello.i' '-v' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/5/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu hello.c -o hello.i -mtune=generic -march=x86-64 -fstack-protector-strong -Wformat -Wformat-security
這是一個gcc編譯器的命令行選項示例。它的作用是將C源文件hello.c預(yù)處理為hello.i文件。下面是每個選項的解釋:
-
-E
: 表示只進(jìn)行預(yù)處理,不進(jìn)行編譯和鏈接操作。 -
-o hello.i
: 指定預(yù)處理輸出的文件名為hello.i。 -
-v
: 詳細(xì)輸出編譯器執(zhí)行的信息。 -
-mtune=generic
: 指定編譯時針對通用處理器進(jìn)行優(yōu)化。 -
-march=x86-64
: 指定生成適用于x86-64架構(gòu)的代碼。 -
-fstack-protector-strong
: 生成強(qiáng)制堆棧保護(hù)的代碼,以防止緩沖區(qū)溢出漏洞。 -
-Wformat -Wformat-security
: 開啟有關(guān)格式化字符串的警告。
gcc編譯c文件
gec@ubuntu:~/hello$ sudo gcc -S?hello.i -o hello.s -v
COLLECT_GCC_OPTIONS='-s' '-o' 'hello.s' '-v' '-mtune=generic' '-march=x86-64'
?/usr/lib/gcc/x86_64-linux-gnu/5/cc1 -fpreprocessed hello.i -quiet -dumpbase hello.i -mtune=generic -march=x86-64 -auxbase hello -version -fstack-protector-strong -Wformat -Wformat-security -o /tmp/cc88JZ4W.s
這是gcc編譯器的另一個命令行選項示例。它的作用是將預(yù)處理過的文件hello.i進(jìn)行進(jìn)一步編譯,生成匯編語言文件hello.s。下面是每個選項的解釋:
-
-s
: 生成匯編語言文件。 -
-o hello.s
: 指定匯編語言輸出文件名為hello.s。 -
-v
: 詳細(xì)輸出編譯器執(zhí)行的信息。 -
-mtune=generic
: 指定編譯時針對通用處理器進(jìn)行優(yōu)化。 -
-march=x86-64
: 指定生成適用于x86-64架構(gòu)的代碼。 -
-fpreprocessed hello.i
: 指定預(yù)處理過的文件hello.i作為輸入文件。 -
-dumpbase hello.i
: 指定基礎(chǔ)輸入文件為hello.i。 -
-auxbase hello
: 指定輔助的基本文件名為hello。 -
-version
: 打印版本信息。 -
-fstack-protector-strong
: 生成強(qiáng)制堆棧保護(hù)的代碼,以防止緩沖區(qū)溢出漏洞。 -
-Wformat -Wformat-security
: 開啟有關(guān)格式化字符串的警告。 -
-o /tmp/cc88JZ4W.s
: 指定匯編語言輸出文件的路徑為/tmp/cc88JZ4W.s。
gcc編譯匯編
sudo gcc -c hello.s -o hello.o -v
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)?
COLLECT_GCC_OPTIONS='-c' '-o' 'hello.o' '-v' '-mtune=generic' '-march=x86-64'
?as -v --64 -o hello.o hello.s
as -v --64 -o hello.o hello.s
gcc在把匯編文件編譯為重定位文件時,使用的是as這個應(yīng)用程序
?
gcc鏈接可重定位文件
ld連接器
collect2封裝了ld連接器
COLLECT_GCC_OPTIONS='-o' 'hello' '-v' '-mtune=generic' '-march=x86-64'
?/usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/cc9OI5DQ.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o hello /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. hello.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o
(封裝了ld程序)
靜態(tài)鏈接
COLLECT_GCC_OPTIONS='-o' 'hello_static' '-v' '-static' '-mtune=generic' '-march=x86-64'
?/usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccqTGMxr.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lc --sysroot=/ --build-id -m elf_x86_64 --hash-style=gnu --as-needed -static -z relro -o hello_static /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginT.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. hello.o --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o
輸入ls -lh 可以看到動態(tài)編譯和靜態(tài)編譯的兩個文件大小區(qū)別
文章來源:http://www.zghlxwxcb.cn/news/detail-643254.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-643254.html
到了這里,關(guān)于嵌入式Linux驅(qū)動開發(fā)系列五:Linux系統(tǒng)和HelloWorld的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!