亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redhat 6.5 gcc編譯器的知識點有哪些

發布時間:2021-11-04 17:39:23 來源:億速云 閱讀:122 作者:柒染 欄目:建站服務器

redhat 6.5 gcc編譯器的知識點有哪些,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

測試結論
1,gcc是編譯器,分為4個階段

2,4個階段為
預處理階段
編譯階段
匯編階段
鏈接階段

3,預處理階段為 即把stdio.h頭文件內容編譯進來

4,編譯階段為GCC首先要檢查代碼的規范性,是否有語法錯誤,以確定代碼實際要作的工作,在檢查無誤后,
GCC把代碼編譯成匯編代碼

5,GCC第3個階段即GCC的匯編階段,即把上述GCC第2個階段產生的.S文件轉化成目標文件

6,GCC第4個階段,即進入GCC的鏈接階段。在這里涉及一個重要的概念:函數庫
我們可以再次查看這個小程序即helloworld.c,在這個程序中并沒有定義printf函數的實現,
且在其預編譯包含進來的頭文件stdio.h中也只有這個函數的聲明,而沒有這個函數的實現,那么到底在哪兒實現
printf函數的呢。答案是:操作系統會把這些函數實現都作到一個名為libc.so.6的庫文件中去了,如果在沒有特別指定時,
GCC會到操作系統默認的路徑即/USR/LIB查找,也就是說會去鏈接到這個路徑的LIBC.SO.6庫函數中,這樣最終就可以實現函數PRINTF的功能了

7,函數庫一般分2處類型:
靜態庫和動態庫
靜態庫是指在編譯鏈接時,把庫文件的代碼會全部加入到可執行文件中,因此生成的文件會比較大,但在運行時也就不需要庫文件了,其后綴一般為.a,

動態庫,與靜態庫相反,在編譯鏈接時,并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時鏈接文件加載庫,這樣就可以節省系統的開銷,
動態庫一般后綴為.SO,如前述LIBC.SO.6就是動態庫。

GCC在編譯時默認采用動態庫

測試明細
1,操作系統版本
[root@mygirl ~]# more /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.5 (Santiago)
[root@mygirl ~]# 


2,編寫一個helloworld.c源代碼文件
[root@mygirl ~]# pwd
/root
[root@mygirl ~]# 


clude
int main() {
   printf("hello world!\n");
   return 0;
}
[root@mygirl ~]# 


3,進行gcc 4個階段第一個階段 預處理階段,即把stdio.h頭文件內容編譯進來


[root@mygirl ~]# gcc -E helloworld.c -o helloworld.i
[root@mygirl ~]# 


[root@mygirl ~]# ll hel*
-rw-r--r--. 1 root root    76 Jun 30 06:20 helloworld.c
-rw-r--r--. 1 root root 16751 Jun 30 06:22 helloworld.i


4,查看GCC預處理階段產生的文件,可見此文件內容極多
[root@mygirl ~]# more helloworld.i|more
# 1 "helloworld.c"
# 1 ""
# 1 ""
# 1 "helloworld.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 361 "/usr/include/features.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 365 "/usr/include/sys/cdefs.h" 3 4
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 366 "/usr/include/sys/cdefs.h" 2 3 4
# 362 "/usr/include/features.h" 2 3 4
# 385 "/usr/include/features.h" 3 4
# 1 "/usr/include/gnu/stubs.h" 1 3 4


# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 5 "/usr/include/gnu/stubs.h" 2 3 4



# 1 "/usr/include/gnu/stubs-64.h" 1 3 4
# 10 "/usr/include/gnu/stubs.h" 2 3 4
# 386 "/usr/include/features.h" 2 3 4
# 29 "/usr/include/stdio.h" 2 3 4


5,經查stdio.h頭文件是把其內容通過GCC預處理階段添加到其預處理的產生的文件中
[root@mygirl ~]# locate stdio.h
/oracle/product/11.2.0/db_1/perl/lib/5.10.0/x86_64-linux-thread-multi/CORE/nostdio.h
/usr/include/stdio.h
/usr/include/bits/stdio.h


[root@mygirl ~]# more /usr/include/stdio.h|more
/* Define ISO C stdio on top of C++ iostreams.
   Copyright (C) 1991, 1994-2008, 2009, 2010 Free Software Foundation, Inc.
   This file is part of the GNU C Library.


   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.


   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.


   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */


/*
 *      ISO C99 Standard: 7.19 Input/output    
 */


#ifndef _STDIO_H


#if !defined __need_FILE && !defined __need___FILE
# define _STDIO_H       1
# include




6,進行gcc第二階段之編譯階段,這個階段就是GCC首先要檢查代碼的規范性,是否有語法錯誤,以確定代碼實際要作的工作,在檢查無誤后,
GCC把代碼編譯成匯編代碼
[root@mygirl ~]# ll helloworld.*
-rw-r--r--. 1 root root    76 Jun 30 06:20 helloworld.c
-rw-r--r--. 1 root root 16751 Jun 30 06:22 helloworld.i


[root@mygirl ~]# gcc -S helloworld.i -o helloworld.s
[root@mygirl ~]# 


[root@mygirl ~]# ll helloworld.*
-rw-r--r--. 1 root root    76 Jun 30 06:20 helloworld.c
-rw-r--r--. 1 root root 16751 Jun 30 06:22 helloworld.i
-rw-r--r--. 1 root root   448 Jun 30 06:38 helloworld.s




[root@mygirl ~]# more helloworld.s
        .file   "helloworld.c"
        .section        .rodata
.LC0:
        .string "hello world!"
        .text
.globl main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $.LC0, %edi
        call    puts
        movl    $0, %eax
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
        .section        .note.GNU-stack,"",@progbits






7,進行GCC第3個階段即GCC的匯編階段,即把上述GCC第2個階段產生的.S文件轉化成目標文件
/root
[root@mygirl ~]# ll helloworld.*
-rw-r--r--. 1 root root    76 Jun 30 06:20 helloworld.c
-rw-r--r--. 1 root root 16751 Jun 30 06:22 helloworld.i
-rw-r--r--. 1 root root   448 Jun 30 06:38 helloworld.s
[root@mygirl ~]# 
[root@mygirl ~]# 


8,進行GCC第4個階段,即進入GCC的鏈接階段。在這里涉及一個重要的概念:函數庫
我們可以再次查看這個小程序即helloworld.c,在這個程序中并沒有定義printf函數的實現,
且在其預編譯包含進來的頭文件stdio.h中也只有這個函數的聲明,而沒有這個函數的實現,那么到底在哪兒實現
printf函數的呢。答案是:操作系統會把這些函數實現都作到一個名為libc.so.6的庫文件中去了,如果在沒有特別指定時,
GCC會到操作系統默認的路徑即/USR/LIB查找,也就是說會去鏈接到這個路徑的LIBC.SO.6庫函數中,這樣最終就可以實現函數PRINTF的功能了
[root@mygirl ~]# gcc -c helloworld.s -o helloworld.o
[root@mygirl ~]# 
[root@mygirl ~]# 
[root@mygirl ~]# ll helloworld.*
-rw-r--r--. 1 root root    76 Jun 30 06:20 helloworld.c
-rw-r--r--. 1 root root 16751 Jun 30 06:22 helloworld.i
-rw-r--r--. 1 root root  1504 Jun 30 06:46 helloworld.o
-rw-r--r--. 1 root root   448 Jun 30 06:38 helloworld.s


[root@mygirl ~]# strings  helloworld.o
hello world!
[root@mygirl ~]# 






9,
函數庫一般分2處類型:
靜態庫和動態庫


靜態庫是指在編譯鏈接時,把庫文件的代碼會全部加入到可執行文件中,因此生成的文件會比較大,但在運行時也就不需要庫文件了,其后綴一般為.a,




動態庫,與靜態庫相反,在編譯鏈接時,并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時鏈接文件加載庫,這樣就可以節省系統的開銷,
動態庫一般后綴為.SO,如前述LIBC.SO.6就是動態庫。


GCC在編譯時默認采用動態庫




[root@mygirl ~]# ll helloworld.*
-rw-r--r--. 1 root root    76 Jun 30 06:20 helloworld.c
-rw-r--r--. 1 root root 16751 Jun 30 06:22 helloworld.i
-rw-r--r--. 1 root root  1504 Jun 30 06:46 helloworld.o
-rw-r--r--. 1 root root   448 Jun 30 06:38 helloworld.s
[root@mygirl ~]# 
[root@mygirl ~]# gcc helloworld.o -o helloworld
[root@mygirl ~]# 
[root@mygirl ~]# 
[root@mygirl ~]# ll helloworld.*
-rw-r--r--. 1 root root    76 Jun 30 06:20 helloworld.c
-rw-r--r--. 1 root root 16751 Jun 30 06:22 helloworld.i
-rw-r--r--. 1 root root  1504 Jun 30 06:46 helloworld.o
-rw-r--r--. 1 root root   448 Jun 30 06:38 helloworld.s
[root@mygirl ~]# 


[root@mygirl ~]# ll helloworld
-rwxr-xr-x. 1 root root 6430 Jun 30 06:58 helloworld
[root@mygirl ~]# 


10,查看GCC第4個階段即GCC的鏈接階段產生不代擴展名的文件名
[root@mygirl ~]# strings  helloworld
/lib64/ld-linux-x86-64.so.2
__gmon_start__
libc.so.6
puts
__libc_start_main
GLIBC_2.2.5
fff.
fffff.
l$ L
t$(L
|$0H
hello world!
[root@mygirl ~]# 


11,執行GCC第4個階段產生的執行文件
[root@mygirl ~]# ./helloworld 
hello world!
[root@mygirl ~]# 




12,查看動態庫文件


[root@mygirl ~]# locate libc.so.6
/lib/libc.so.6
/lib/i686/nosegneg/libc.so.6
/lib64/libc.so.6
/oracle/product/11.2.0/db_1/lib/stubs/libc.so.6




[root@mygirl ~]# strings  /lib/libc.so.6 |grep -i --color printf
vswprintf
__obstack_vprintf_chk
vasprintf
printf_size
__vfprintf_chk
vfwprintf
__vsprintf_chk

[root@mygirl ~]# more /oracle/product/11.2.0/db_1/lib/sysliblist 
-ldl -lm -lpthread -lnsl -lirc -lipgo -lsvml

看完上述內容,你們掌握redhat 6.5 gcc編譯器的知識點有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长泰县| 宜宾市| 凤凰县| 吉木乃县| 潼关县| 沙湾县| 会东县| 东海县| 阿拉善右旗| 景宁| 郓城县| 墨玉县| 含山县| 六枝特区| 历史| 当涂县| 安丘市| 西吉县| 临西县| 泗水县| 南康市| 云和县| 和龙市| 大庆市| 栾城县| 盐源县| 苍山县| 新巴尔虎左旗| 灌阳县| 太仆寺旗| 日喀则市| 邻水| 河津市| 志丹县| 平和县| 南皮县| 金川县| 南和县| 丰城市| 平武县| 社会|