---
# System prepended metadata

title: 「你所不知道的 C 語言：執行階段程式庫 (CRT)」 筆記
tags: [System Software, Computer Science]

---

---
title: 「你所不知道的 C 語言：執行階段程式庫 (CRT)」 筆記
tags: Computer Science,System Software
description: 2019.08.02
---
「你所不知道的 C 語言：執行階段程式庫 (CRT)」 筆記
===
###### 2019.08.02 *Copyright © 2019 by srhuang*

![](https://i.imgur.com/3bLGtSB.png)

[影片](https://youtu.be/qAVdTrC7YyU)
[講義](http://hackfoldr.org/dykc/https%253A%252F%252Fhackmd.io%252Fs%252FHkcr5cn97)
Original by [jserv](http://wiki.csie.ncku.edu.tw/User/jserv)

---

## 動機

* Visual C++ runtime error：https://youtu.be/qAVdTrC7YyU?t=1
* man atexit：https://youtu.be/qAVdTrC7YyU?t=218
* C 語言歷史：https://youtu.be/qAVdTrC7YyU?t=346
    * 1972-1973 C語言及其編譯器發展完成
    * ANSI 1989 Standardization

## C 語言關鍵字獨到之處

* multics PL/I [1964]：https://youtu.be/qAVdTrC7YyU?t=758
* 關鍵字：https://youtu.be/qAVdTrC7YyU?t=962
    * COBOL and Fortran 的關鍵字和保留字 都和 I/O有關，但 C 語言的關鍵字與 I/O 無關
* C語言之前的歷史：https://youtu.be/qAVdTrC7YyU?t=1103
    * [The First Programming Languages: Crash Course Computer Science #11](https://www.youtube.com/watch?v=RU1u-js7db8)

## 先看 Microsoft 的文件怎麼說

* DLL 和 Visual C++ 執行階段程式庫行為：https://youtu.be/qAVdTrC7YyU?t=1315
* How To Use the C Run-Time：https://youtu.be/qAVdTrC7YyU?t=1658
* NaN：https://youtu.be/qAVdTrC7YyU?t=1888
* perror：https://youtu.be/qAVdTrC7YyU?t=2137
* 為什麼要了解 CRT？ 為什麼要了解系統？：https://youtu.be/qAVdTrC7YyU?t=2437
* MSVC 與 CRT 的恩怨情仇：https://youtu.be/qAVdTrC7YyU?t=2574

## 回到編譯流程

* 複習 你所不知道的 C 語言：編譯器和最佳化原理篇：https://youtu.be/qAVdTrC7YyU?t=2811
* int main() { return 1; }：https://youtu.be/qAVdTrC7YyU?t=3089
* _exit() / exit() 的介紹：https://youtu.be/qAVdTrC7YyU?t=3195
    * The function _exit() is like exit(3), but does not call any functions registered with atexit(3) or on_exit(3). 
* FPU：https://youtu.be/qAVdTrC7YyU?t=3637
    * 特別在硬體沒有 FPU 時，需要 libgcc 來提供浮點運算協助
    * [Hard / Soft floating](https://stackoverflow.com/questions/3321468/whats-the-difference-between-hard-and-soft-floating-point-numbers)
* 驗證執行檔：https://youtu.be/qAVdTrC7YyU?t=4112
    * uefi signature

## int main(int argc, char *argv[]) 背後的學問

* void main 的錯誤：https://youtu.be/qAVdTrC7YyU?t=4444
* argument expression (caller) / parameter value (callee)：https://youtu.be/qAVdTrC7YyU?t=4536
    * parameterized type：C++ STL template 大量使用.
* envp 的宣告：https://youtu.be/qAVdTrC7YyU?t=4923
    * int main(int argc, char *argv[], char *envp[])
    * APUE 經典書。
    * 由 argv 的擺放方式可以發現，後面是接著 envp。 
    * CRT 也要負責傳遞環境變數。
* 觀察執行時期：https://youtu.be/qAVdTrC7YyU?t=5732
    * cmdline
    * environ
* 深度剖析 C 語言 main 函式：https://youtu.be/qAVdTrC7YyU?t=6001

## GNU Toolchain

* 簡介：https://youtu.be/qAVdTrC7YyU?t=6251
* Computer Science from the Bottom Up：https://youtu.be/qAVdTrC7YyU?t=6341
    * GNU Toolchain
* Linking：https://youtu.be/qAVdTrC7YyU?t=6632
    * crti.o, crtbeginS.o, crtendS.o, crtn.o
* Linker Script：https://youtu.be/qAVdTrC7YyU?t=7334
    * init / fini
* crt0：https://youtu.be/qAVdTrC7YyU?t=7609
    * argc, argv, envp get from stack。
    * call main
    * call exit
* newlib/i386 的實作程式碼：https://youtu.be/qAVdTrC7YyU?t=7919
    * GNU Hurd OS 的歷史奇耙。
    * Newlib for embedded systems.
* Creating a C Library：https://youtu.be/qAVdTrC7YyU?t=8643

## 總結：https://youtu.be/qAVdTrC7YyU?t=8761


