如何在给定内存内容的情况下重建C结构?

时间:2014-06-18 14:47:29

标签: c struct gdb

给定一些内存内容(例如来自gdb)我想重构一个C结构的内容。 struct定义如下(请参阅man semop):

unsigned short sem_num;  /* semaphore number */
short          sem_op;   /* semaphore operation */
short          sem_flg;  /* operation flags */

和内存内容(由使用调试器的struct的地址指示)如下:

00000000  00 00 ff ff 00 10 78 bd  21 0a 8c c8 24 0a c4 95  |......x.!...$...|
00000010  5e 09 d0 69 22 08 18 78  c9 bf ed f4 28 08 00 00  |^..i"..x....(...|
00000020  00 00 01 00 00 00 01 00  00 00 00 00 00 00 01 00  |................|

sem_numsem_opsem_flag的价值是多少?假设第一个变量使用一个字节是否安全,而另外两个每个使用两个字节?那我可以做下面的映射吗?

sem_num = 00
sem_op  = 00 ff
sem_flg = ff 00

1 个答案:

答案 0 :(得分:0)

根据Dark Falcon的建议,以下代码似乎可以完成这项工作:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int
main (void)
{
  struct sembuf my_sembuf[1]= {
    {0,-1,16*256}
  };

  unsigned char data[sizeof my_sembuf];
  size_t i;
  memcpy(data, &my_sembuf, sizeof my_sembuf);
  for (i=0; i < sizeof my_sembuf; ++i)
    printf("%02x\n", data[i]);
 return 0;
}

include确保已定义semop结构,需要填充该结构并与内存转储进行比较。事实证明,semop结构的内容必须如下:

unsigned short sem_num = 0;
short          sem_op  = -1;
short          sem_flg = 16*256; /* Corresponding to the flag SEM_UNDO */