잘못된 버전의 함수가 호출되어 segfault가 발생하는 문제를 디버깅하려고합니다. 내가 컴파일하는 코드는 생성 된 기계이고 'times'라는 함수가 포함되어 있는데,이 함수는 두 개의 인수가 복합 곱셈을 수행합니다. 이 코드는 더 높은 레벨의 오브젝트 파일에 링크되기 전에 .o로 컴파일됩니다.C 프로그램이 잘못된 함수 버전에 연결합니다.
이 코드를 실행할 때 segfaults와 gdb는 동일한 수의 인수를 사용하지 않는 glibc의 'times'버전에 있음을 나타냅니다. 이 코드에 '#include 아무 곳이나'인스턴스가 없습니다.
시간 이름을 times1로 변경하면 문제가 해결됩니다. 이것은 장기간의 해결책은 아니지만 기계가 코드를 생성하고 수동으로이 함수의 이름을 편집하는 것이 항상 매력적이지 않기 때문에 그렇습니다.
전체 혼잡이 -Wall로 정리되므로 어디에서 볼 것인지 잘 모르겠습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
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
Gene - 의견을 좀 자세히 설명해 주시겠습니까? times.c 실제로 그 단일 개체로 컴파일 된 별도의 C 파일입니다. 왜 이것이 문제를 일으킬 것이라고 생각하십니까? 실제로이 항목에 관심이있는 항목은 하나뿐입니다. '시간'은 그 중 하나가 아닙니다. 즉 그것은 완전히 내부적이어야하며 더 높은 계층에 대한 동적 인 기호로 보지 않아야합니다. 이것에 대해 gcc에게 말할 수있는 방법이 있습니까? –