2011-04-23 86 views
2

手動編譯是否可以編譯一個簡單的Hello World程序,該程序僅使用提供的gcc/glibc文件而不是使用操作系統提供的默認程序? (因此,執行時,程序將只使用提供的文件而不是操作系統提供的文件。)我在網上無處不在,但無法繼續工作:使用gcc -v

我試圖手動執行此操作gcc -v simple.c但我無法自己複製它。

這是我的嘗試:(提供的所有文件都在桌面上)

/home/myuser/Desktop/cc1 -quiet -v simple.c -quiet -dumpbase simple.c -mtune=generic -auxbase simple -version -o /tmp/temp1.s 

如何能在以下路徑更改爲自定義的,而不是默認的?

 
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" 
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../x86_64-linux-gnu/include" 
#include "..." search starts here: 
#include search starts here: 
/usr/local/include 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include 
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/include-fixed 
/usr/include/x86_64-linux-gnu 
/usr/include 
End of search list. 
GNU C (Debian 4.4.5-8) version 4.4.5 (x86_64-linux-gnu) 
    compiled by GNU C version 4.4.5, GMP version 4.3.2, MPFR version 3.0.0-p3. 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Compiler executable checksum: dac4d891d068d1bed01868869b00bd17 
as -V -Qy -o /tmp/temp2.o /tmp/temp1.s 
 
GNU assembler version 2.20.1 (x86_64-linux-gnu) using BFD version (GNU Binutils for Debian) 2.20.1-system.20100303 
/home/myuser/Desktop/collect2 --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=both -dynamic-linker ld-2.11.2.so crt1.o crti.o crtbegin.o /tmp/temp2.o libgcc.a --as-needed libgcc_s.so.1 --no-as-needed libc.a libgcc_s.so.1 --as-needed libgcc.a --no-as-needed crtend.o crtn.o 

爲什麼是用來代替所提供的ld-2.11.2.so下面的/ usr/bin中/ LD?

 
/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie 
collect2: ld returned 1 exit status 

任何人都可以修改它的工作?

回答

0

-v向您顯示編譯器驅動程序執行的操作。它不會影響你得到的標準庫。

要使用所有自定義庫運行,請使用-nostdlib

+0

我試過了,它也不起作用:gcc -nostdlib /home/myuser/Desktop/libgcc.a /home/myuser/Desktop/libc.a simple.c/usr/bin/ld:warning:找不到條目符號_start;默認爲0000000000400144 /tmp/ccDFp8hh.o:在函數'main'中: simple.c :(。text + 0x1d):未定義的引用'memcpy' simple.c :(.text + 0x29):未定義的引用'puts' collect2:ld返回1退出狀態 – 2011-04-23 17:43:33

+0

@Janet:您需要在庫路徑名之前加上'-l',例如'-l/home/myuser/Desktop/libgcc.a'。 – Potatoswatter 2011-04-23 17:57:37

0

如何將下面的路徑更改爲 定製的而不是默認的?

只需將-I path添加到編譯器調用。該路徑將在內部路徑之前添加。

爲什麼下面的/ usr/bin中/ LD使用 ,而不是提供ld-2.11.2.so?

第一個是可執行二進制文件,第二個是共享對象。您不能在二進制文件中使用共享對象。

+0

我用-I,仍然得到相同的確切的錯誤。爲什麼? – 2011-04-23 17:40:12

+0

@Janet你的意思是鏈接錯誤?那是因爲你沒有編譯位置獨立的可執行文件支持。但我認爲這就是你想要做的。 '-I'當然只是修改包含路徑。當然,包括路徑與鏈接無關。請嘗試解釋你試圖達到的目標。你的問題並不清楚。 – 2011-04-23 17:56:34