SUN gcc 관련 문의
solaris 8에서 gcc를 이용하여 컴파일하여 처리하는데요..
dns 관련 메시지를 만들려고 하다가 segment error가 나는데요..
소스는
int dns_update(char* zone, unsigned int addr, int expire, char* server)
{
HEADER *hp;
char *p,*cp;
char name[BUFSIZ],realm[BUFSIZ],hostname[BUFSIZ];
char buf[1024];
hp = (HEADER *)buf;
bzero(hp,sizeof(*hp));
hp->id = htons(rand()%0xFFFF);
hp->qr = 0;
hp->opcode = NS_UPDATE_OP;
hp->qdcount = htons(1);
hp->ancount = htons(0);
hp->nscount = htons(1);
hp->arcount = htons(0);
strcpy(hostname, zone);
if(cp=strchr(hostname, '@')) {
*cp = ' ';
sscanf(hostname,"%s%s",name,realm);
}
p = (char*)(hp+1);
cp = (char*)strtok(realm, ".");
if (cp) {
*p++ = strlen(cp);
memcpy(p, cp, strlen(cp));
p += strlen(cp);
while(cp = (char*)strtok(NULL, ".")) {
*p++ = strlen(cp);
memcpy(p, cp, strlen(cp));
p+=strlen(cp);
}
}
*p++ = 0x00;
*((unsigned short*)p)++ = htons(T_SOA);
*((unsigned short*)p)++ = htons(C_IN);
name[0]=realm[0]=0;
strcpy(hostname,zone);
if(cp=strchr(hostname,'@')) {
*cp = ' ';
sscanf(hostname,"%s%s",name,realm);
}
if (name) {
*p++ = strlen(name);
memcpy(p, name, strlen(name));
p+=strlen(name);
}
*p++ = 0xC0;
*p++ = 0x0C;
*((unsigned short*)p)++ = htons(T_A);
*((unsigned short*)p)++ = htons(C_IN);
*((unsigned int*)p)++ = htonl(expire);
*((unsigned short*)p)++ = htons(4);
*((unsigned int*)p)++ = addr;
len = p - buf;
}
여기에서 gdb를 이용해 보면
Program received signal SIGSEGV, Segmentation fault.
*((unsigned int*)p)++ = addr;
에서 멈추네요..
alignment error 같이 보이는데.. 맞는지요?
*((unsigned short*)p)++ = htons(T_A);
*((unsigned short*)p)++ = htons(C_IN);
*((unsigned int*)p)++ = htonl(expire);
*((unsigned short*)p)++ = htons(4);
*((unsigned int*)p)++ = addr;
len = p - buf;
를
*((unsigned short*)p)++ = htons(T_A);
*((unsigned short*)p)++ = htons(C_IN);
*((unsigned int*)p)++ = htonl(expire);
*((unsigned short*)p)++ = htons(4);
*((unsigned short*)p)++ = htons(4);
----------------------------------------------
*((unsigned int*)p)++ = addr;
len = p - buf;
처럼 밑줄친부분 처럼 하면 넘어가거든요..
혹시 리눅스에서는 문제가 없었는디.. 선에서 해보니까..
위와 같이 발생하는데 alignment 문제인지요/
그렇다면 gcc에 어떻게 옵션을 주어야 할지요..
스트럭쳐가 아니라서 pack을 처리 안할것 같은데요..
알려 주시면 감사하겠습니다..


댓글 달기