64bit 구조체 패딩 질문 입니다.

fivestar의 이미지

64bit 포팅 작업을 하게 되면서

선언한 구조체들을 모두 #pragma pack(1) 처리를 하였습니다.

그럼에도 불구하고

아래와 같은 상황이 발생이 발생하는데 이유를 모르겠습니다.

ex)
공용 구조체 : struct data;
struct data *d1;

d1 = func1();

예를 들어 func1 에서 동일한 구조체 형태의 주소값을 넘겨주도로곡 되어있습니다.
그런데 func1에서 data 구조체를 return 하기 전에 주소는 0x7ffff7ea6010 인데

위의 소스에서 받는 부분에서 받고 나서 주소를 보게 되면 0xfffffffff7ea6010 입니다.

패딩과 관련되어 발생하는 문제 같은데 해당 구조체는 pragma pack(1)을 통해 정렬을 하였는데도 왜 문제가 발생하는지

아시는분은 답변 부탁드릴게요 :)

jick의 이미지

그리고 컴파일러 경고 메시지는 전부 켜시고요.

func1의 prototype이 선언이 안되어서 받는 쪽에서 func1의 리턴 타입을 int로 생각하고 있을 거라고... 추측해 봅니다.

fivestar의 이미지

해당 함수를 extern 하고 있는 헤더파일이 상위에 include 되어 있습니다.

익명 사용자의 이미지

64비트 포팅하는데 왜 1로 팩을 하시나요? 전혀 상관없는 부분인 것 같은데요.

fivestar의 이미지

구조체 패딩 문제 때문에 1바이트 정렬해서 문제 해결하려고 처리한 부분입니다.
추후 문제가 모두 해결되면 바이트정렬을 빼면서 포팅작업을 진행하려 합니다.

bushi의 이미지

증상을 재현할 수 있는 가장 간단한 형태의 func1() 을 포함한 소스를 제시해보세요.

fivestar의 이미지

꽤 큰 프로젝트 이기 때문에 정확한 구조를 올리지 못하고 간단한 형태로 올린거였습니다.
위의 분께서 말씀하신 문제가 맞았네요.
헤더 파일중 하나가 pragma once 처리가 재대로 되어있지 않았으며 또한 정확한 include(extern 함수정의)가 되지 않은 상태였는데도
라이브러리 파일로 만든상태에서 라이브러리내부 와 외부에서 함수를 호출하는데 문제가 없더라구요.
따라서 32비트에서는 윗분께서 말씀하신대로 기본 데이타형인 int로 받아오더라도 문제가 없었는데 64비트에서 주소값 확장으로 인하여
문제가 발생한 부분이였습니다.
기본이 안되어 잠재적인 큰문제가 되는 부분이였는데 이제서야 발견하였습니다.
이번 기회에 큰 깨달음을 얻었습니다.
모두 감사드립니다.

bushi의 이미지

예상외로 그런 실수를 많이들 합니다.
kldp 에 올라온 64bit seg.fault 질문 거의 모두가 그 묵시적 형변환 때문입니다.
형변환이 func1() 반환 때 이뤄진 것인지 printf() 호출 때 이뤄진 것인지 명확치않아 코드를 제시해보시라 했습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.