I'm having an issue with a piece of code I'm trying to compile using mingw-w64
gcc. The pieces of code I'm specifically having an issue with is as follows...
struct duplicate {
pthread_mutex_t mutex;
size_t count;
struct digest_t digest;
struct vector devices;
struct hash_entry hash;
struct queue_entry queue;
};
struct vector {
size_t size;
size_t limit;
void** store;
};
struct device {
dev_t device;
struct vector entries;
};
struct entry {
dev_t device;
ino_t inode;
off_t size;
uid_t uid;
gid_t gid;
mode_t mode;
#ifdef HAVE_STAT_BLKSIZE
blksize_t bs;
#endif
time_t mtime_sec;
time_t mtime_nsec;
bool valid;
int fd;
void* mm;
struct vector aliases;
};
int do_print(const struct duplicate* d) {
const bool n = opts.null;
const char de = n ? '\0' : '\n';
if (opts.quiet)
return 0;
const struct device* v;
vector_for_each(v, &d->devices) {
struct entry* e;
vector_for_each(e, &v->entries) {
const char* const a = entry_alias(e);
if (entry_handle_modify(e))
continue;
printf("%s%c", a, de);
if (e->aliases.size == 1)
continue;
for (size_t k = 1; k < e->aliases.size; k++) {
const char* const a = vector_get(&e->aliases, k);
printf(" * %s%c", a, de);
}
}
}
return 0;
}
The disassembly for it looks like this...
000000000040226e <do_print>:
40226e: 55 push rbp
40226f: 48 89 e5 mov rbp,rsp
402272: 48 83 ec 60 sub rsp,0x60
402276: 48 89 4d 10 mov QWORD PTR [rbp+0x10],rcx
40227a: 48 8b 05 ef 1e 01 00 mov rax,QWORD PTR [rip+0x11eef]
# 414170 <.refptr.opts>
402281: 0f b6 40 03 movzx eax,BYTE PTR [rax+0x3]
402285: 88 45 e7 mov BYTE PTR [rbp-0x19],al
402288: 80 7d e7 00 cmp BYTE PTR [rbp-0x19],0x0
40228c: 74 07 je 402295 <do_print+0x27>
40228e: b8 00 00 00 00 mov eax,0x0
402293: eb 05 jmp 40229a <do_print+0x2c>
402295: b8 0a 00 00 00 mov eax,0xa
40229a: 88 45 e6 mov BYTE PTR [rbp-0x1a],al
40229d: 48 8b 05 cc 1e 01 00 mov rax,QWORD PTR [rip+0x11ecc]
# 414170 <.refptr.opts>
4022a4: 0f b6 40 02 movzx eax,BYTE PTR [rax+0x2]
4022a8: 84 c0 test al,al
4022aa: 74 0a je 4022b6 <do_print+0x48>
4022ac: b8 00 00 00 00 mov eax,0x0
4022b1: e9 2a 01 00 00 jmp 4023e0 <do_print+0x172>
4022b6: 48 c7 45 f8 00 00 00 mov QWORD PTR [rbp-0x8],0x0
4022bd: 00
4022be: e9 e5 00 00 00 jmp 4023a8 <do_print+0x13a>
4022c3: 48 c7 45 f0 00 00 00 mov QWORD PTR [rbp-0x10],0x0
4022ca: 00
4022cb: e9 a0 00 00 00 jmp 402370 <do_print+0x102>
4022d0: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
4022d4: 48 89 c1 mov rcx,rax
4022d7: e8 32 f6 ff ff call 40190e <entry_alias>
4022dc: 48 89 45 c8 mov QWORD PTR [rbp-0x38],rax
4022e0: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
4022e4: 48 89 c1 mov rcx,rax
4022e7: e8 cc f6 ff ff call 4019b8 <entry_handle_modify>
4022ec: 84 c0 test al,al
4022ee: 74 02 je 4022f2 <do_print+0x84>
4022f0: eb 79 jmp 40236b <do_print+0xfd>
4022f2: 0f be 55 e6 movsx edx,BYTE PTR [rbp-0x1a]
4022f6: 48 8b 45 c8 mov rax,QWORD PTR [rbp-0x38]
4022fa: 41 89 d0 mov r8d,edx
4022fd: 48 89 c2 mov rdx,rax
402300: 48 8d 0d bd f6 00 00 lea rcx,[rip+0xf6bd] # 4119c4
<default_init_devices+0xd4>
402307: e8 dc d2 00 00 call 40f5e8 <printf>
40230c: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
402310: 48 8b 40 40 mov rax,QWORD PTR [rax+0x40]
402314: 48 83 f8 01 cmp rax,0x1
402318: 75 02 jne 40231c <do_print+0xae>
40231a: eb 4f jmp 40236b <do_print+0xfd>
40231c: 48 c7 45 e8 01 00 00 mov QWORD PTR [rbp-0x18],0x1
402323: 00
402324: eb 37 jmp 40235d <do_print+0xef>
402326: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
40232a: 48 8d 48 40 lea rcx,[rax+0x40]
40232e: 48 8b 45 e8 mov rax,QWORD PTR [rbp-0x18]
402332: 48 89 c2 mov rdx,rax
402335: e8 1a f5 ff ff call 401854 <vector_get>
40233a: 48 89 45 c0 mov QWORD PTR [rbp-0x40],rax
40233e: 0f be 55 e6 movsx edx,BYTE PTR [rbp-0x1a]
402342: 48 8b 45 c0 mov rax,QWORD PTR [rbp-0x40]
402346: 41 89 d0 mov r8d,edx
402349: 48 89 c2 mov rdx,rax
40234c: 48 8d 0d 76 f6 00 00 lea rcx,[rip+0xf676] # 4119c9
<default_init_devices+0xd9>
402353: e8 90 d2 00 00 call 40f5e8 <printf>
402358: 48 83 45 e8 01 add QWORD PTR [rbp-0x18],0x1
40235d: 48 8b 45 d0 mov rax,QWORD PTR [rbp-0x30]
402361: 48 8b 40 40 mov rax,QWORD PTR [rax+0x40]
402365: 48 3b 45 e8 cmp rax,QWORD PTR [rbp-0x18]
402369: 77 bb ja 402326 <do_print+0xb8>
40236b: 48 83 45 f0 01 add QWORD PTR [rbp-0x10],0x1
402370: 48 8b 45 d8 mov rax,QWORD PTR [rbp-0x28]
402374: 48 8b 40 08 mov rax,QWORD PTR [rax+0x8]
402378: 48 3b 45 f0 cmp rax,QWORD PTR [rbp-0x10]
40237c: 76 25 jbe 4023a3 <do_print+0x135>
40237e: 48 8b 45 d8 mov rax,QWORD PTR [rbp-0x28]
402382: 48 8b 40 18 mov rax,QWORD PTR [rax+0x18]
402386: 48 8b 55 f0 mov rdx,QWORD PTR [rbp-0x10]
40238a: 48 c1 e2 03 shl rdx,0x3
40238e: 48 01 d0 add rax,rdx
402391: 48 8b 00 mov rax,QWORD PTR [rax]
402394: 48 89 45 d0 mov QWORD PTR [rbp-0x30],rax
402398: 48 83 7d d0 00 cmp QWORD PTR [rbp-0x30],0x0
40239d: 0f 85 2d ff ff ff jne 4022d0 <do_print+0x62>
4023a3: 48 83 45 f8 01 add QWORD PTR [rbp-0x8],0x1
4023a8: 48 8b 45 10 mov rax,QWORD PTR [rbp+0x10]
4023ac: 48 8b 40 50 mov rax,QWORD PTR [rax+0x50]
4023b0: 48 3b 45 f8 cmp rax,QWORD PTR [rbp-0x8]
4023b4: 76 25 jbe 4023db <do_print+0x16d>
4023b6: 48 8b 45 10 mov rax,QWORD PTR [rbp+0x10]
4023ba: 48 8b 40 60 mov rax,QWORD PTR [rax+0x60]
4023be: 48 8b 55 f8 mov rdx,QWORD PTR [rbp-0x8]
4023c2: 48 c1 e2 03 shl rdx,0x3
4023c6: 48 01 d0 add rax,rdx
4023c9: 48 8b 00 mov rax,QWORD PTR [rax]
4023cc: 48 89 45 d8 mov QWORD PTR [rbp-0x28],rax
4023d0: 48 83 7d d8 00 cmp QWORD PTR [rbp-0x28],0x0
4023d5: 0f 85 e8 fe ff ff jne 4022c3 <do_print+0x55>
4023db: b8 00 00 00 00 mov eax,0x0
4023e0: 48 83 c4 60 add rsp,0x60
4023e4: 5d pop rbp
4023e5: c3 ret
Anything that dereferences an entry pointer triggers an access violation. From
the disassembly, it looks like the value of the entry pointer is being pulled
off the stack without dereferencing anything from the actual argument value.
The code does work if it's copied into the calling function however.
Suggestions?
My MinGW version is 4.0.2 (4.9.2).
jason@fi ~/development/git/uxcn/yafd $ $CC --version
x86_64-w64-mingw32-gcc (GCC) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-Jason
------------------------------------------------------------------------------
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public