2012-11-02 3 views
5

잘못된 버전의 함수가 호출되어 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 
+3

여러 개의 C 파일을 하나의 .o 파일로 컴파일하는 것은 일반적이지 않습니다. 'times.c'가이 그룹에서 컴파일 된 여러 개의 C 파일 중 하나라면 문제를 설명 할 수 있습니다. – Gene

+1

'# include'는 선언 만 가져옵니다. 연결에 대한 제어권이 없습니다. 'times' 함수를 선언하고 호출하면, 컴파일러는 심볼 테이블에 그 이름에 대한 참조를 포함하는 객체 파일을 생성 할 것이고, 링커는 최종 실행 파일을 생성 할 때 그 이름의 정의를 찾을 것입니다 . libc에는'times' 함수가 있으며 링커가 찾은 것입니다. – Wyzard

+0

Gene - 의견을 좀 자세히 설명해 주시겠습니까? times.c 실제로 그 단일 개체로 컴파일 된 별도의 C 파일입니다. 왜 이것이 문제를 일으킬 것이라고 생각하십니까? 실제로이 항목에 관심이있는 항목은 하나뿐입니다. '시간'은 그 중 하나가 아닙니다. 즉 그것은 완전히 내부적이어야하며 더 높은 계층에 대한 동적 인 기호로 보지 않아야합니다. 이것에 대해 gcc에게 말할 수있는 방법이 있습니까? –

답변

0

그럼 실제 답변은 -fno-builtin-times을 gcc에 버리는 것입니다. 그렇게하면 문제를 깔끔하게 피할 수 있습니다.

물론 이것은 times의 이름을 glibc 제공 함수와 충돌하지 않는 것으로 변경할 수 없다고 가정합니다.

3

C는 함수 이름 만 식별자로 사용하므로 같은 이름을 가진 두 개의 (내 보낸) 함수가 충돌합니다. 일반적으로 라이브러리에서 내 보낸 모든 이름 앞에 고유 한 접두어를 붙입니다. 다른 대안은 C++을 "더 나은 C"로 사용하고 단순히 C++ 컴파일러를 사용하여 C 코드를 작성하고 C++ 이름 변환을 사용하는 것입니다.

+0

이 경우 링커가 "중복 기호"와 함께 막히지 않아야합니까? –

+0

같은 기호가있는 두 개의 다른 .o 파일을 강제로 드래그하지 않는 이상은 아닙니다. – bmargulies

+0

@ H2CO3 UNIX 링커 * 같은 심볼이 주 실행 파일과 공유 라이브러리 (여기에서는'libc.so.6')에 정의되어있을 때 불평하지 않습니다. - 심볼 삽입은 꽤 흔하고 종종 유용합니다. –

관련 문제