64비트 로 소스 포팅 중 함수 포인터 문제..
글쓴이: fivestar / 작성시간: 화, 2011/09/27 - 2:38오후
32비트에서 돌던 프로그램을 64비트로 작업하고 있습니다.
변수형들은 64비트로 바뀐것들에 한하여 모두 작업 완료 하였습니다.
그런데 함수 포인터를 사용하는곳에서 segment fault 가 발생하더군요
디버깅을 해보면 해당 함수 진입조차 못하고 만나면 바로 죽어버리네요
64비트에서는 포인터형이 64비트라고 하던데 이와 관련하여 문제가 발생하는것일까요?
segment fault 가 발생하는게 조금 이해가 안되네요
컴파일 환경은 리눅스 gcc 입니다.
답변 기다리겠습니다
Forums:
참고로 해당 함수를 함수포인터를 이용하지 않고
참고로 해당 함수를 함수포인터를 이용하지 않고 호출하게 되면 문제 없이 사용이 가능합니다.
함수 포인터를 어떻게 선언했는지, 함수 포인터를
함수 포인터를 어떻게 선언했는지, 함수 포인터를 정수형으로 변환해서 저장해두었다가 사용하는지 등등을 코드로 같이 보여주셔야 답변할 수 있을 것 같습니다.
디버깅을 해보니 함수포인터의 문제가 아니네요 문제가
디버깅을 해보니 함수포인터의 문제가 아니네요
문제가 발생하는 부분을 다시 확인해보니 주소때문에 문제가 발생하는데 이유를 모르겠네요
구조체 자체의 주소값은 32bit인데 구조체 안에 선언된 포인터와 구조체는 주소값이 64bit라서 문제가 되네요
같은 형태의 구조체를 핸들링 함수에서 선언하여 처리할때 확인해보면 구조체 와 구조체안의 포인터 또한 32bit 주소값인데
메인쪽에서의 리턴받는곳에 선언된 형태는 구조체 자체는 32bit 주소값인데 구조체안의 포인터 및 구조체가 주소값이 64bit네요
그래서 뒤의 0으로 채워지게 되어 가리키는 주소가 없어 segment fault 가 발생하고 있습니다.
- 이해가 안되는 부분은 64bit에서는 포인터 자체는 64bit로 확장된다고 하는데
선언된 구조체 포인터의 주소값은 32bit입니다. 하지만 구조체 안의 선언된 포인터는 64bit주소입니다.
또한 핸들링 하는곳에서 확인하기엔 구조체 안의 주소값도 32bit이나 메인쪽에서만 맞지않아 문제가 발생 합니다.
이에 대한 이유와 해결책을 아신다면 도움 부탁 드리겠습니다. :)
윗분도 말씀하셨지만... 주변 배경 없이 상황설명만
윗분도 말씀하셨지만... 주변 배경 없이 상황설명만 하시니 지금 무슨 그림인지 알수가 없네요.
"선언된 구조체 포인터의 주소값이 32bit"인건 어떻게 확인하셨나요?
ex) struct _db_callback
ex) struct _db_callback
{
....함수포인터 ...
}
struct _db_pool
{
struct _db_callback *callback;
.....
}
일단 사용하는 구조체는 위와 같은 형식이구요
struct _db_pool *pool; 과 같이 선언하여 pool->callback->함수포인터변수 를 이용하고 있습니다.
주소값은 gdb를 이용하여 확인 하였습니다.
문제가 되는 부분은
ex)
메인함수에서
struct _db_pool *pool = get_pool();
하여 get_pool 함수에 들어가서 핸들링되어 구조체를 retrun 해줍니다.
get_pool 함수 안에서의 pool 의 주소값 0x1eaf350 pool->callback => 0x62e3b0 과 같습니다.
하지만 메인쪽에서 리턴을 받아서 확인해보면 pool 의 주소값 0x1eaf350 pool->callback => 0x62e3b000000000
와 같이 확인이 됩니다.
즉 , 메인쪽은 구조체 allocation 을 하면 pool->callback 의 주소값이 0x12345000000000 과 같이 되며 get_pool 함수안에서 구조체 alloctaion을
하면 0x123450으로만 확인됩니다.
출력은 gdb에서 p 로 확인과 printf %p 로 확인하였습니다.
64bit 아키텍처 & 주소값에 대한 이해가 많이 부족하오니 도움 부탁드리겠습니다.
댓글 달기