FreeFlyOS 二十三 cmake部分詳解

2021-10-13 20:29:32 字數 1854 閱讀 7025

mac_x86_toolchain.cmake

set(cmake_system_name darwin)

set(cmake_system_version 1)

set(cmake_system_processor x86_64)

# gcc

find_program(x86_64 x86_64-elf-gcc required)

if (not x86_64)

message(fatal_error "x86_64-elf-gcc not found.\n"

"run `brew install x86_64-elf-gcc` to install the toolchain.")

else ()

message(status "found x86_64-elf-gcc $.")

endif ()

set(toolchain_prefix x86_64-elf-)

set(cmake_c_compiler $gcc)

set(cmake_objcopy $objcopy)

通過.cmake設定不同環境下的編譯工具鏈,mac環境下的工具鏈如上圖所示。

另外說明一下,本人用的是64位的x86機器,如果使用的是32位的機器,那就需要根據情況來設定,看到這裡,有很多讀者可能會問,mac電腦下自帶gcc版本,為什麼要用x86_64-elf-gcc呢,因為mac電腦下的gcc只支援mac系統下的檔案系統,不認elf檔案系統,那我們要寫乙個類似linux的核心,肯定要用到它的檔案系統,而gcc早就幫我們想到了這一點,所以其提供了跨平台的編譯器----x86_64-elf-gcc,這樣我們編譯鏈結執行出來的就是elf檔案格式了。

linux_x86_toolchain.cmake

set(cmake_system_name linux)

set(cmake_system_version 1)

set(cmake_system_processor x86_64)

# gcc

find_program(x86_64 x86_64-elf-gcc required)

if (not x86_64)

message(fatal_error "x86_64-elf-gcc not found.\n"

"run `brew install x86_64-elf-gcc` to install the toolchain.")

else ()

message(status "found x86_64-elf-gcc $.")

endif ()

set(toolchain_prefix x86_64-elf-)

set(cmake_c_compiler $gcc)

set(cmake_objcopy $objcopy)

linux環境下的工具鏈如上圖

看到這裡是不是很奇怪,怎麼和mac環境下的配置一模一樣嗎,按理說,linux環境下的gcc支援elf檔案格式,沒必要使用跨平台的x86_64-elf-gcc啊,呃,這實際上和mbr有關,freeflyos的mbr中的內容太多了,又要開保護模式,又要設定gdt,還得讀取核心,還用到了函式,這就會導致最後生成的二進位制檔案超過512b。其實這也不是主要原因,我發現了linux下的gcc編譯鏈結出來的檔案都會加上一些其他的section,講道理,要執行freeflyos的mbr包括.text和.data段就足夠了,所以其他section就沒用了,還會增加檔案大小。而用跨平台的x86_64-elf-gcc就不會有這個問題了,當然,我也試過把其他section剝離,最後還是會超過512b,無奈只能選擇x86_64-elf-gcc了。對編譯鏈結以及elf檔案感興趣的同學可以看看下面的鏈結,教你打造史上最小的可執行elf檔案(45位元組)。

隨筆 二十三

1.gradle 完a整指南 android 2.android gradle 外掛程式 3.0 挖坑日記 3.android效能優化全方面解析 4.android studio 3.2新功能特性 5.重新認識 androidstudio 和 gradle,這些都是你應該知道的 6。美團外賣andr...

演算法(二十三)

1 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。public int maxsubarray int nums return maxsum 複雜度分析 public int maxsubarray int nums return maxsum 2 ...

二十三 管道

在go語言中可以通過chan來定義管道,可以通過操作符 和 對管道進行讀取和寫入操作 通過管道維護例程狀態 使用make函式初始化,make chan type make chan type,len 不帶len引數的用於建立無快取區的管道,使用len建立指定緩衝區長度的管道 讀寫管道 可通過操作符 ...