Skip to content

Instantly share code, notes, and snippets.

@xieyuheng
Created May 1, 2015 05:47
Show Gist options
  • Save xieyuheng/b90898000668e5cac10f to your computer and use it in GitHub Desktop.
Save xieyuheng/b90898000668e5cac10f to your computer and use it in GitHub Desktop.
to get offset of structure for assembly code
#include <sys/types.h>
#include <sys/stat.h>
#include <stddef.h>
#include <time.h>
// the following are reported by : man 2 stat
struct the_stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
struct timespec st_atim; /* time of last access */
struct timespec st_mtim; /* time of last modification */
struct timespec st_ctim; /* time of last status change */
#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
int
main(int argc, char *argv[])
{
printf("\n");
printf("\n(%d) (%u) dev_t st_dev; ", sizeof(dev_t), offsetof(struct stat, st_dev));
printf("\n(%d) (%u) ino_t st_ino; ", sizeof(ino_t), offsetof(struct stat, st_ino));
printf("\n(%d) (%u) mode_t st_mode; ", sizeof(mode_t), offsetof(struct stat, st_mode));
printf("\n(%d) (%u) nlink_t st_nlink; ", sizeof(nlink_t), offsetof(struct stat, st_nlink));
printf("\n(%d) (%u) uid_t st_uid; ", sizeof(uid_t), offsetof(struct stat, st_uid));
printf("\n(%d) (%u) gid_t st_gid; ", sizeof(gid_t), offsetof(struct stat, st_gid));
printf("\n(%d) (%u) dev_t st_rdev; ", sizeof(dev_t), offsetof(struct stat, st_rdev));
printf("\n(%d) (%u) off_t st_size; ", sizeof(off_t), offsetof(struct stat, st_size));
printf("\n(%d) (%u) blksize_t st_blksize; ", sizeof(blksize_t), offsetof(struct stat, st_blksize));
printf("\n(%d) (%u) blkcnt_t st_blocks; ", sizeof(blkcnt_t), offsetof(struct stat, st_blocks));
printf("\n");
printf("\n(%d) (%u) __time_t tv_sec; ", sizeof(__time_t), offsetof(struct timespec, tv_sec));
printf("\n(%d) (%u) __syscall_slong_t tv_nsec; ", sizeof(__syscall_slong_t), offsetof(struct timespec, tv_nsec));
printf("\n");
}
// the following is example result :
/*
(8) (0) dev_t st_dev;
(8) (8) ino_t st_ino;
(4) (24) mode_t st_mode;
(8) (16) nlink_t st_nlink;
(4) (28) uid_t st_uid;
(4) (32) gid_t st_gid;
(8) (40) dev_t st_rdev;
(8) (48) off_t st_size;
(8) (56) blksize_t st_blksize;
(8) (64) blkcnt_t st_blocks;
(8) (0) __time_t tv_sec;
(8) (8) __syscall_slong_t tv_nsec;
*/
@NalaGinrut
Copy link

@xieyuheng maybe you need __attribute__ ((packed)) for you structure fields for avoiding padding.
https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-g_t_0040code_007bpacked_007d-variable-attribute-3331

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment