Linux下如何將原始檔逐步編譯成目標檔案的過程
前言
請講一下linux如何原始檔逐步編譯成可執行檔案。
解答
首先先上圖對編譯的整個過程有個感性的認識,然後再逐步分析各個過程。
以hello.c 程式為例
# include <stdio.h>
main{
printf("hello\n");
}
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
一個.c源程式需要經過前處理器生成.i檔案,再經過編譯器生成.s檔案,再經過彙編器生成可重定位目標檔案.o檔案,再與其他.o檔案經過連結器生成最終的可執行目標程式。
-
預處理階段。主要是處理原始檔中以“#”開頭的預編譯指令。
- 刪除#define並展開巨集
- 處理所有條件預編譯指令,如#if, #ifdef, #endif
- 插入標頭檔案到“#include”處
- 刪除所有註釋
- 新增行號和檔名標識,以便編譯時編譯器產生除錯用的行號資訊
- 保留所有#pragma編譯指令。
- 編譯階段。將預處理得到的預處理檔案進行語法分析,詞法分析,語義分析,優化後,生成彙編程式碼檔案(組合語言源程式)。
- 彙編階段。利用匯程式設計序(彙編器)將組合語言源程式轉換成機器指令序列(機器語言程式)。
- 連結階段。將多個可重定位的目標檔案.o合併以生成可執行檔案,其可以被載入到記憶體中,由系統執行。
相關推薦
Linux下如何將原始檔逐步編譯成目標檔案的過程
前言 請講一下linux如何原始檔逐步編譯成可執行檔案。 解答 首先先上圖對編譯的整個過程有個感性的認識,然後再逐步分析各個過程。 以hello.c 程式為例 # include <stdio.h> main{ printf("hello\n"
單目跟蹤位姿產品研發(二)----在linux下將c++工程打包成動態庫so檔案API
單目跟蹤位姿專案由對方公司提供應用場景,我方研發核心演算法,通過c++實現功能,然後對方公司通過java\js來開發炫酷的介面,共同合作完成,最終對方公司負責銷售推廣,推向市場。因此,涉及到java介面呼叫c++核心程式碼的問題。 現記錄
將Linux下python預設版本切換成替代版本
當你安裝 Linux 時,安裝過程有可能同時為你提供多個可用的 Python 版本,因此係統中會存在多個 Python 的可執行二進位制檔案。你可以按照以下方法使用 ls 命令來檢視你的系統中都有那些 Python 的二進位制檔案可供使用。 $ ls /usr/bin/python* /
Linux下將tomcat註冊成系統服務
編寫啟動指令碼 vi /etc/rc.d/init.d/tomcat //需將JAVA_HOME和CAGTALANA_HOME替換成自己的jdk安裝目錄和tomcat安裝目錄 #!/bin/bash # # tomcat startup script for
linux下將pdf檔案轉換成swf檔案
用PHP用到了線上瀏覽pdf檔案的功能,js播放外掛需要同時將pdf檔案轉換成swf檔案兩者兼用才能達到效果。 安裝swftools 中文支援安裝: mkdir –p /usr/share/xpdf cd /usr/share/xpdf/ 下載中文支援及字型庫 wget ftp:/
在Linux下將oracle資料庫碰到字元亂碼時改成utf8編碼的方法
在Linux下oracle資料庫碰到字元亂碼的解決方法 linux下Oracle顯示中文亂碼的情況和原因 DEPTNO DNAME LOC ---------- -------------- -------------
Linux下將檔案打包、壓縮並分割成指定大小
轉自https://blog.csdn.net/loongembedded/article/details/54233175 Linux解壓檔案時遇到的問題,不知道總的資料是分了好多份,需要輸入命令統一解壓 1、普通tar壓縮命令 tar -zcvf
linux下將一個目錄下的所有檔案拷貝到另一個大檔案中,並把大檔案拆分成原來的小檔案,大小,內容,名字不變
經過四五天的編寫與除錯,初步完成了檔案操作工具的內容,以下是程式碼說明: 首先,我測試用的檔案在/home/xudong/mywork下,我的最終生成檔案是在這個路徑下,/home/xudong/work/resultfile.txt,分開後生成的小檔案在/home/xud
Linux下使用make命令編譯c原始檔
make命令是GNU的工程化編譯工具,用於編譯眾多相互關聯的原始碼問價,以實現工程化的管理,提高開發效率。make命令唯一讀取的檔案是Makefile,在較大的專案中,有些檔案沒有編譯有些編譯過,Makefile中指定一定的規則來對整個專案的所有檔案新型編譯,make命令讀取
在linux下如何將資料夾壓縮成.tgz檔案
.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是壓縮!) --------------------------------------------- .gz 解壓1:gunzi
Windows下使用Graalvm將Javafx應用編譯成exe
1 背景 Graalvm是Oracle推出的一款新型虛擬機器,其中一個吸引人的功能是:它可以將Java程式碼編譯成各個平臺的原生代碼,這些平臺包括:linux、macOS、windows、iOS、android。 這個功能可以極大地加快Java程式的啟動速度,它對於docker+微服務(雲原生)應用
Linux下將用戶添加到sudoers中
http his root密碼 配置 not in rep 希望 輸入密碼 -h Linux默認是沒有將用戶添加到sudoers列表中的,需要root手動將賬戶添加到sudoers列表中,才能讓普通賬戶執行sudo命令。 root 賬戶鍵入visudo即可進入sudo配置,
Linux下通過源碼編譯安裝程序
安裝程序 configure 系統目錄 install 命令 com 需要 figure .com ASK: Linux下通過源碼編譯安裝程序(configure/make/make install的作用) configure Linux 平臺有各種不同的配置,安裝時需
使用windbg在開啟PAE的情況下將虛擬地址轉化成物理地址
技術分享 dir halt cgroup nbsp session bre dog 格式 在開啟PAE之後,32位的線性地址的結構發生了變化,具體結構如下 30-31位:頁目錄指針表索引 21-29位:頁目錄索引 12-20位:頁表索引 0-11位:頁內偏移 在開啟PAE
使用kotlinc命令將kt檔案編譯成class檔案
kotlin的配置 聽說google谷歌宣佈 kotlin成為安卓開發的一級語言之後,作為安卓程式設計師怎能淡定。但是網上關於kotlin的資料又少之又少,後來在網上找到了一本
Linux下搭建arm交叉編譯環境
首先需要在網上搜索arm-linux-gcc-4.3.2.tgz 傳到Linux下,執行tar xzvf arm-linux-gcc-4.3.2.tgz -C/ 解壓到根目錄下(目錄結構/usr/local/arm/4.3.2) 這樣,編譯器就解壓到了Linux系統中 然後建立
AndroidStudio下將android library打成jar包
在AndroidStudio下,需要將android library打包成SDK,亦即是jar包,可以在library專案下的build.gradle下配置以下指令碼 //以下為生成jar包的指令碼程式碼 def SDK_BASENAME = "MediaSDK" def SDK_VERSION
win環境下webstorm把scss編譯成wxss
win環境下的webstorm安裝啟用自行百度,Mac下的啟用安裝請看https://blog.csdn.net/taoqidejingling/article/details/83856177 webstorm下配置scss編譯成wxss。 安裝好後看圖:file---Settings
linux下將檔案設定為swap
在網上弄了一臺VPS,結果安裝完系統發現沒有swap。因為記憶體比較小,沒有swap有時候容易卡死,於是打算設定一個檔案充當swap。以前幹過這事,不過因為一般裝系統時候會設,所以這功能基本用不到,漸漸也就忘了。今天又查了一下,記錄在此備忘。 先建立一個固定大小的檔案 sudo dd if
Linux下將Mysql和Apache加入到系統服務裡的方法
原文地址 Apache加入到系統服務裡面: cp /安裝目錄下/apache/bin/apachectl /etc/rc.d/init.d/httpd 修改httpd 在檔案頭部加入如下內容: ### # Comments to support