---
# System prepended metadata

title: C 190119 筆記
tags: [C, asm, shellscript, makefile, gcc]

---

C 190119 筆記
===

# makefile
1. 直接舉例
    makefile:
    ```
    ljpcc: ljpcc.o
    ```

    shell:
    ```
    $ ls
    ljpcc.c makefile
    $ make
    cc -c -o ljpcc.o ljpcc.c
    cc ljpcc.o -o ljpcc
    ```

    結論:
    若 make 的 target 跟 prerequisites 剛好是
    ```
        xxx: xxx.o
    ```
    且同資料夾又有 xxx.c, 則會自動幫你執行產生出 xxx 和 xxx.o 的 command

    reference: ftp://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_2.html

# shellScript
1. 可以用
    ```shell
    # Command x has been executed
    if [! $? ] ...
    ```
    來得知 command x 是否有被執行成功
    其中 $? 為上個指令執行後的回傳值
# C & gcc
1. 直接舉例:
    mymain.s:
    ```asm
    .global mymain
    mymain:
	    mov $1, %eax
	    ret
    ```
    driver.c:
    ```c
    #include <stdio.h>

    extern int mymain(void);

    int main() {
        int val = mymain();
        printf("%d\n", val);
        return 0;
    }
    ```
    shell:
    ```
    $ gcc -o tmp.out driver.c mymain.s
    $ ./tmp.out
    1
    ```
    結論:
    可以直接寫組語給 gcc 編譯
2. gcc 可以透過 -S 參數來產生出單一個.c檔案 target.c 的組語
    ```
    $ gcc -S -o tmp.s driver.c
    ```

3. gcc 有提供 attribute weak 可以用
    test.c:
    ```
    extern void foo() __attribute__((weak))

    int main() {
        if(foo) foo();
    }
    ```
    以上程式碼可以編譯並且可以執行
    原因是加上了 attribute weak 的 function
    在 link 時若找不到實體, 則會用 0 來代表該 function 的值
    
    reference: https://blog.xuite.net/tzeng015/twblog/113272140-%E4%BB%80%E9%BA%BC%E6%98%AFweak+symbol%3F

# 
###### tags: `C` `shellscript` `makefile` `asm` `gcc`