The following test application fails to build on i686 when building
without optimization:
$ cat foo.c
#include <windows.h>
int
main ()
{
MEMORY_BASIC_INFORMATION m;
NT_TIB *tib = (NT_TIB *) NtCurrentTeb ();
VirtualQuery (tib, &m, sizeof m);
}
$ gcc -g -O foo.c -o foo
$ gcc -g foo.c -o foo
/tmp/ccnnAEl3.o: In function `main':
/home/corinna/foo.c:7: undefined reference to `NtCurrentTeb'
collect2: error: ld returned 1 exit status
There's no way around that, except for building with optimization, which
is often not prudent when debugging.
In winnt.h, NtCurrentTeb is using __CRT_INLINE which, depending on C
standard, expandes into
extern inline __attribute__((__gnu_inline__))
or
extern __inline__
However, that's not sufficient for NtCurrentTeb, nor for GetCurrentFiber,
nor for GetFiberData, since these are inline-only functions not backed by
non-inlined library versions.
This patch fixes that by using FORCEINLINE in place of __CRT_INLINE.
Signed-off-by: Corinna Vinschen <[email protected]>
---
mingw-w64-headers/include/winnt.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/mingw-w64-headers/include/winnt.h
b/mingw-w64-headers/include/winnt.h
index 8d8bd0d..56d663d 100644
--- a/mingw-w64-headers/include/winnt.h
+++ b/mingw-w64-headers/include/winnt.h
@@ -1995,15 +1995,15 @@ __buildmemorybarrier()
#define DbgRaiseAssertionFailure __int2c
- __CRT_INLINE struct _TEB *NtCurrentTeb(void)
+ FORCEINLINE struct _TEB *NtCurrentTeb(void)
{
return (struct _TEB *)__readfsdword(PcTeb);
}
- __CRT_INLINE PVOID GetCurrentFiber(void)
+ FORCEINLINE PVOID GetCurrentFiber(void)
{
return(PVOID)__readfsdword(0x10);
}
- __CRT_INLINE PVOID GetFiberData(void)
+ FORCEINLINE PVOID GetFiberData(void)
{
return *(PVOID *)GetCurrentFiber();
}
--
2.1.0
------------------------------------------------------------------------------
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public