Package: btrfs-tools
Version: 3.14.1-1
Usertags: goto-cc

During a rebuild of all packages in a clean sid chroot (and cowbuilder+pbuilder)
the build failed with the following error. Please note that we use our research
compiler tool-chain (using tools from the cbmc package), which permits extended
reporting on type inconsistencies at link time.

[...]
gcc -g -Os -fstack-protector --param=ssp-buffer-size=4 -Wformat 
-Werror=format-security -o btrfs btrfs.o help.o cmds-subvolume.o 
cmds-filesystem.o cmds-device.o cmds-scrub.o cmds-inspect.o cmds-balance.o 
cmds-send.o cmds-receive.o cmds-quota.o cmds-qgroup.o cmds-replace.o 
cmds-check.o cmds-restore.o cmds-rescue.o chunk-recover.o super-recover.o 
cmds-property.o \
  ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o root-tree.o 
dir-item.o file-item.o inode-item.o inode-map.o extent-cache.o extent_io.o 
volumes.o utils.o repair.o qgroup.o raid6.o free-space-cache.o list_sort.o 
props.o -Wl,-z,relro -luuid -lblkid -lm -lz -llzo2 -lcom_err -L. libbtrfs.a 
-lpthread

error: conflicting function declarations "fstat"
old definition in module cmds-filesystem file 
/usr/include/x86_64-linux-gnu/sys/stat.h line 220
signed int (signed int, struct stat *)
new definition in module cmds-replace file 
/usr/include/x86_64-linux-gnu/sys/stat.h line 220
signed int (signed int, struct stat *)
Makefile:179: recipe for target 'btrfs' failed
make[2]: *** [btrfs] Error 64

While these declarations appear to be perfectly consistent, the extended
diagnostics produced by our tool explain the difference:

reason for conflict in types listed below (struct/struct):
composite type component counts differ (18/15)
struct stat {
  unsigned long int st_dev;
  unsigned long int st_ino;
  unsigned long int st_nlink;
  unsigned int st_mode;
  unsigned int st_uid;
  unsigned int st_gid;
  signed int __pad0;
  unsigned long int st_rdev;
  signed long int st_size;
  signed long int st_blksize;
  signed long int st_blocks;
  signed long int st_atime;
  unsigned long int st_atimensec;
  signed long int st_mtime;
  unsigned long int st_mtimensec;
  signed long int st_ctime;
  unsigned long int st_ctimensec;
  signed long int [3l] __unused;
}
struct stat {
  unsigned long int st_dev;
  unsigned long int st_ino;
  unsigned long int st_nlink;
  unsigned int st_mode;
  unsigned int st_uid;
  unsigned int st_gid;
  signed int __pad0;
  unsigned long int st_rdev;
  signed long int st_size;
  signed long int st_blksize;
  signed long int st_blocks;
  struct timespec st_atim;
  struct timespec st_mtim;
  struct timespec st_ctim;
  signed long int [3l] __unused;
}

This difference is caused by #define _XOPEN_SOURCE 500 being present in
cmds-filesystem.c, while this is missing (at least) from cmds-replace.c. It
would likely be best to specify this define on the compiler command line to
ensure consistency across all files.

Best,
Michael

Attachment: pgpXUvVFZBCM3.pgp
Description: PGP signature

Reply via email to