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`