64비트 로 소스 포팅 중 함수 포인터 문제..

fivestar의 이미지

32비트에서 돌던 프로그램을 64비트로 작업하고 있습니다.

변수형들은 64비트로 바뀐것들에 한하여 모두 작업 완료 하였습니다.

그런데 함수 포인터를 사용하는곳에서 segment fault 가 발생하더군요

디버깅을 해보면 해당 함수 진입조차 못하고 만나면 바로 죽어버리네요

64비트에서는 포인터형이 64비트라고 하던데 이와 관련하여 문제가 발생하는것일까요?

segment fault 가 발생하는게 조금 이해가 안되네요

컴파일 환경은 리눅스 gcc 입니다.

답변 기다리겠습니다

fivestar의 이미지

참고로 해당 함수를 함수포인터를 이용하지 않고 호출하게 되면 문제 없이 사용이 가능합니다.

kukyakya의 이미지

함수 포인터를 어떻게 선언했는지, 함수 포인터를 정수형으로 변환해서 저장해두었다가 사용하는지 등등을 코드로 같이 보여주셔야 답변할 수 있을 것 같습니다.

fivestar의 이미지

디버깅을 해보니 함수포인터의 문제가 아니네요

문제가 발생하는 부분을 다시 확인해보니 주소때문에 문제가 발생하는데 이유를 모르겠네요

구조체 자체의 주소값은 32bit인데 구조체 안에 선언된 포인터와 구조체는 주소값이 64bit라서 문제가 되네요

같은 형태의 구조체를 핸들링 함수에서 선언하여 처리할때 확인해보면 구조체 와 구조체안의 포인터 또한 32bit 주소값인데

메인쪽에서의 리턴받는곳에 선언된 형태는 구조체 자체는 32bit 주소값인데 구조체안의 포인터 및 구조체가 주소값이 64bit네요

그래서 뒤의 0으로 채워지게 되어 가리키는 주소가 없어 segment fault 가 발생하고 있습니다.

- 이해가 안되는 부분은 64bit에서는 포인터 자체는 64bit로 확장된다고 하는데

선언된 구조체 포인터의 주소값은 32bit입니다. 하지만 구조체 안의 선언된 포인터는 64bit주소입니다.

또한 핸들링 하는곳에서 확인하기엔 구조체 안의 주소값도 32bit이나 메인쪽에서만 맞지않아 문제가 발생 합니다.

이에 대한 이유와 해결책을 아신다면 도움 부탁 드리겠습니다. :)

planetarium의 이미지

윗분도 말씀하셨지만... 주변 배경 없이 상황설명만 하시니 지금 무슨 그림인지 알수가 없네요.
"선언된 구조체 포인터의 주소값이 32bit"인건 어떻게 확인하셨나요?

fivestar의 이미지

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 아키텍처 & 주소값에 대한 이해가 많이 부족하오니 도움 부탁드리겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.