arm-linux-gcc 나 arm-linux-g++에서 packed에 의한 버그인지좀 봐주세요...

레모네이드의 이미지

#include <stdio.h>
 
#ifdef _WIN32
#define _packed __attribute__((__packed__))
#else
#define _packed
#endif
 
struct  normal_t {
    int          v;
};
 
#pragma pack(1)
struct _packed packed_t {
    short        v;
    normal_t     n;
};
#pragma pack()
 
int main() {
      normal_t n = {1000};
      packed_t pk;
      pk.v = 2000;
      printf("%d\n",pk.v);
      pk.n = n;
      printf("%d\n",pk.v);
      return 0;
}

arm-linux-g++로 컴파일하여 실행한 결과는
2000
1000

vc 및 g++로 컴파일하여 실행한 결과는

2000
2000

union도 아니고...왜 이리 되는지....
packed struct 가 문제를 일으키는거 같습니다..
위의 코드를 vc나 g++ gcc로 컴파일하는겨우에는 문제가 없으나
arm-lunux-gcc나 arm-linux-g++로 컴파일하는 경우에는 문제가 발생하네요...
지금 막연하게 컴파일러 버그인가 추정하고 있습니다..

통신용 코드를 작성하는데 이 문제를 해결해야 해서 골치가 아프네요...
디버깅하다가 스레드부터 뒤지기 시작해서 온 코드 다 뒤지다가 24시간동안 디버깅해서 간신히 찾은 버그가...
위와 같은 코드에서 벌어지는 현상이라니 ....... ㅠㅠ....

레모네이드의 이미지

#include 
 
#ifdef _WIN32
#define _packed __attribute__((__packed__))
#else
#define _packed
#endif
 
struct  normal_t {
    int          v;
};
 
#pragma pack(1)
struct _packed packed_t {
    short        v;
    normal_t     n;
};
#pragma pack()
 
int main() {
      normal_t n = {1000};
      packed_t pk;
      pk.v = 2000;
      printf("%d\n",pk.v);
      pk.n.v = n.v;
      printf("%d\n",pk.v);
      return 0;
}

이런 방법으로는 가능한데.... normal_t 구조체에 맴버 데이터가 여러개 인경우에는 각각 전부 따로 할당해야하는 번거로움이 생기네요..
근데 아무리 생각해도 arm-linux-g++가 버그같은데...
우....win,win.ce,lunux,arm-lunux, 다 돌아가게 만드는 코드로 작성하는것은 넘 힘든 작업임에 틀림 없습니다...

이렇게 않하고 할수 있는 방법이 있으면 공유좀 바랍니다....

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.