我試圖調試錯誤版本的函數被調用導致段錯誤的問題。我正在編譯的代碼是機器生成的,並且包含一個名爲'times'的函數,它實現了兩個參數的複數乘法。此代碼在鏈接到更高級別的對象文件之前被編譯爲.o。C程序鏈接到錯誤版本的函數
運行此代碼時,segfaults和gdb指示它在glibc的'times'版本中,它甚至沒有使用相同數量的參數。這個代碼中沒有#include的實例。
將時間的名稱更改爲times1可解決問題。這不是一個長期的解決方案,儘管由於代碼的機器生成特性以及手動編輯此函數的名稱始終沒有吸引力。
整個混亂編譯清洗與牆壁,所以我不知道在哪裏看。任何想法如何解決這個問題?
Compile chain:
gcc -Wall -I. -g --shared -o dpd.o -fPIC *.c (mahine generated code here)
gcc -g --std=c99 -c -fpic getData.c -I/usr/local/include -L/usr/local/lib -lmatio -I/usr/local/include/iverilog -I$(MATLAB)
gcc -g -shared -o getData.vpi getData.o $(MATLAB)/dpd.o -lvpi -lmatio -L/usr/local/lib
將多個C文件編譯爲單個'.o'並不常見。如果'times.c'是在這個組中編譯的幾個C文件之一,它可以解釋這個問題。 – Gene
'#include'只能引入聲明;它無法控制鏈接。如果聲明一個名爲'times'的函數然後調用它,編譯器將生成一個對象文件,該文件在其符號表中包含對該名稱的引用,然後鏈接器將在生成最終可執行文件時搜索該名稱的定義。在libc中有一個'times'函數,這就是鏈接器找到的。 – Wyzard
基因 - 您可否詳細說明您的評論? times.c確實是一個單獨的C文件,它被編譯到單個對象中。你爲什麼期望這會導致問題?實際上我只對這個.o感興趣的一個入口點,'時代'不是其中之一。即它應該是完全內部的並且不被視爲高層的動態符號。有沒有辦法告訴gcc這件事? –