2015-04-27 29 views
0

我有一個項目,我試圖做一些庫和系統調用基準測試。我想確保編譯器不會優化我的呼叫。從gcc -o0優化級別鏈接錯誤

這裏是我的makefile:

CC=gcc 
CFLAGS= -I ./ 
LIBFLAGS= -lm 
RM=/bin/rm -f 

all: osbench 

osbench: osbench.c 
    $(CC) $(CFLAGS) -o [email protected] osbench.c $(LIBFLAGS) 

clean: 
    $(RM) osbench *~ 

當我設置的標誌-o一切編譯和運行完美,但我不知道如果編譯器省去了我的電話給math.h中的庫。 根據gcc手冊(https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)-o0表示不進行優化 - 這是我想要的。當我將標誌設置爲-o0時,我得到各種鏈接錯誤。

$(CC) $(CFLAGS) -o0 [email protected] osbench.c $(LIBFLAGS) 

是否有另一個我失蹤的標誌?

gcc -I ./ -o0 osbench osbench.c -lm 
osbench: In function `_fini': 
(.fini+0x0): multiple definition of `_fini' 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o:(.fini+0x0):         first defined here 
osbench: In function `__data_start': 
(.data+0x0): multiple definition of `__data_start' 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 0 has invalid symbol index 10 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 1 has invalid symbol index 11 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 2 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 3 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 4 has invalid symbol index 10 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 5 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 6 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 7 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 8 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 9 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 10 has invalid symbol index 11 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 11 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 12 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 13 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 14 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 15 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 16 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 17 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 18 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 19 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): reloca        tion 20 has invalid symbol index 19 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.data+0x0):         first defined here 
osbench: In function `__data_start': 
(.data+0x8): multiple definition of `__dso_handle' 
/usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o:(.data+0x0): first defined here 
osbench:(.rodata+0x0): multiple definition of `_IO_stdin_used' 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.rodata.cst4        +0x0): first defined here 
osbench: In function `_start': 
(.text+0x0): multiple definition of `_start' 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): reloca        tion 0 has invalid symbol index 2 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:/build/buildd        /eglibc-2.15/csu/../sysdeps/x86_64/elf/start.S:109: first defined here 
osbench: In function `_init': 
(.init+0x0): multiple definition of `_init' 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o:(.init+0x0):         first defined here 
/tmp/ccOMIYX2.o:(.rodata+0x0): multiple definition of `numOfCallsPerTrial' 
osbench:(.rodata+0x8): first defined here 
/tmp/ccOMIYX2.o:(.rodata+0x8): multiple definition of `numOfTrials' 
osbench:(.rodata+0x10): first defined here 
/tmp/ccOMIYX2.o: In function `runLibCallTrial': 
osbench.c:(.text+0x0): multiple definition of `runLibCallTrial' 
osbench:(.text+0xe4): first defined here 
/tmp/ccOMIYX2.o: In function `calcLibCallTime': 
osbench.c:(.text+0xab): multiple definition of `calcLibCallTime' 
osbench:(.text+0x18f): first defined here 
/tmp/ccOMIYX2.o: In function `main': 
osbench.c:(.text+0x143): multiple definition of `main' 
osbench:(.text+0x38c): first defined here 
/usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o:(.dtors+0x0): multiple definition of         `__DTOR_END__' 
osbench:(.dtors+0x8): first defined here 
/usr/bin/ld: error in osbench(.eh_frame); no .eh_frame_hdr table will be created        . 
collect2: ld returned 1 exit status 

如果有必要,但是基準測試代碼部分是一個家庭作業,所以我不知道我允許我可以張貼我的代碼。它編譯得很好,否則我不認爲這是一個問題.c 謝謝。

回答

4

-O不是-o。也就是說,大寫不小寫。無論如何,你可以完全放棄它。默認爲-O0

如果不明確,-o具有不同的含義。它確定編譯輸出名稱。所以你應該保留在你的命令行中。添加-O以更改優化級別(或將其保留爲默認級別)。所以實際上,你原來的版本已經禁用了優化。

+0

感謝您的回覆。我按照你的建議嘗試了-O0,並得到和以前完全相同的錯誤。我不確定這些標誌是否區分大小寫。 :P 我將不參加。我將繼續假設它不像你說的那樣優化默認值。 – entroz

+0

沒有實際的命令和輸出,我不能告訴你你的具體問題是什麼。但我可以告訴你,這些標誌肯定是區分大小寫的。不要把它從我身上拿走。海灣合作委員會手冊文件。 [此處](https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#Overall-Options)代替'-o'和[here](https://gcc.gnu.org/onlinedocs/) gcc/Optimize-Options.html#Optimize-Options)爲'-O'。 – kaylum

+0

啊。我的make文件的輸出是這樣的: gcc -I ./ -O0 osbench osbench.c -lm – entroz