GCC documentation for alias attribute for variables says:

  https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
  Using both the alias and the alias target to access the same object is
  undefined in a translation unit without a declaration of the alias with
  the attribute.

So declare also aliases of import symbols via alias attribute to prevent
possible undefined behavior. This also reduce memory usage as all aliased
symbols declared via __MINGW_IMP_SYMBOL will share same global variable.

Note that aliased symbol has to be declared with "extern" keyword even it
is not extern and gcc will emit this symbol (as described in documentation).

So for example:

  int var_non_alias = 1;
  int var_target = 2;
  extern int __attribute__ ((alias ("var_target"))) var_alias;

Emits symbols:

  SYMBOL TABLE:
  [  0](sec -2)(fl 0x00)(ty   0)(scl 103) (nx 1) 0x00000000 test.c
  File
  [  2](sec  1)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .text
  AUX scnlen 0x0 nreloc 0 nlnno 0
  [  4](sec  2)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .data
  AUX scnlen 0x8 nreloc 0 nlnno 0
  [  6](sec  3)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .bss
  AUX scnlen 0x0 nreloc 0 nlnno 0
  [  8](sec  4)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .rdata$zzz
  AUX scnlen 0x1e nreloc 0 nlnno 0
  [ 10](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000000 _var_non_alias
  [ 11](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000004 _var_target
  [ 12](sec  2)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000004 _var_alias

  Contents of section .data:
   0000 01000000 02000000                    ........
---
 mingw-w64-crt/misc/imaxabs.c   | 4 ++--
 mingw-w64-crt/misc/imaxdiv.c   | 3 ++-
 mingw-w64-crt/misc/strtoimax.c | 6 ++++--
 mingw-w64-crt/misc/strtoumax.c | 6 ++++--
 mingw-w64-crt/stdio/atoll.c    | 2 +-
 5 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/mingw-w64-crt/misc/imaxabs.c b/mingw-w64-crt/misc/imaxabs.c
index 4f144a7ad56c..eae73b21f00b 100644
--- a/mingw-w64-crt/misc/imaxabs.c
+++ b/mingw-w64-crt/misc/imaxabs.c
@@ -22,7 +22,7 @@ imaxabs (intmax_t _j)
 intmax_t (__cdecl *__MINGW_IMP_SYMBOL(imaxabs))(intmax_t) = imaxabs;
 
 long long __attribute__ ((alias ("imaxabs"))) __cdecl llabs (long long);
-long long (__cdecl *__MINGW_IMP_SYMBOL(llabs))(long long) = llabs;
+extern long long __attribute__((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(imaxabs))))) (__cdecl 
*__MINGW_IMP_SYMBOL(llabs))(long long);
 
 __int64 __attribute__ ((alias ("imaxabs"))) __cdecl _abs64 (__int64);
-__int64 (__cdecl *__MINGW_IMP_SYMBOL(_abs64))(__int64) = _abs64;
+extern __int64 __attribute__((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(imaxabs))))) (__cdecl 
*__MINGW_IMP_SYMBOL(_abs64))(__int64);
diff --git a/mingw-w64-crt/misc/imaxdiv.c b/mingw-w64-crt/misc/imaxdiv.c
index 7db911fa940c..36800046f5a0 100644
--- a/mingw-w64-crt/misc/imaxdiv.c
+++ b/mingw-w64-crt/misc/imaxdiv.c
@@ -32,4 +32,5 @@ imaxdiv_t (__cdecl *__MINGW_IMP_SYMBOL(imaxdiv))(intmax_t, 
intmax_t) = imaxdiv;
 lldiv_t __attribute__ ((alias ("imaxdiv")))
 __cdecl
 lldiv (long long, long long); 
-lldiv_t (__cdecl *__MINGW_IMP_SYMBOL(lldiv))(long long, long long) = lldiv;
+extern lldiv_t __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(imaxdiv)))))
+(__cdecl *__MINGW_IMP_SYMBOL(lldiv))(long long, long long);
diff --git a/mingw-w64-crt/misc/strtoimax.c b/mingw-w64-crt/misc/strtoimax.c
index 7f09869cb0b1..a6a20c3e6244 100644
--- a/mingw-w64-crt/misc/strtoimax.c
+++ b/mingw-w64-crt/misc/strtoimax.c
@@ -115,9 +115,11 @@ intmax_t (__cdecl *__MINGW_IMP_SYMBOL(strtoimax))(const 
char* __restrict__, char
 long long __attribute__ ((alias ("strtoimax")))
 __cdecl
 strtoll (const char* __restrict__ nptr, char ** __restrict__ endptr, int base);
-long long (__cdecl *__MINGW_IMP_SYMBOL(strtoll))(const char* __restrict__, 
char ** __restrict__, int) = strtoll;
+extern long long __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(strtoimax)))))
+(__cdecl *__MINGW_IMP_SYMBOL(strtoll))(const char* __restrict__, char ** 
__restrict__, int);
 
 __int64 __attribute__ ((alias ("strtoimax")))
 __cdecl
 _strtoi64 (const char* __restrict__ nptr, char ** __restrict__ endptr, int 
base);
-__int64 (__cdecl *__MINGW_IMP_SYMBOL(_strtoi64))(const char* __restrict__, 
char ** __restrict__, int) = _strtoi64;
+extern __int64 __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(strtoimax)))))
+(__cdecl *__MINGW_IMP_SYMBOL(_strtoi64))(const char* __restrict__, char ** 
__restrict__, int);
diff --git a/mingw-w64-crt/misc/strtoumax.c b/mingw-w64-crt/misc/strtoumax.c
index d47a7c90d8f1..f368f5eee128 100644
--- a/mingw-w64-crt/misc/strtoumax.c
+++ b/mingw-w64-crt/misc/strtoumax.c
@@ -113,9 +113,11 @@ uintmax_t (__cdecl *__MINGW_IMP_SYMBOL(strtoumax))(const 
char* __restrict__, cha
 unsigned long long __attribute__ ((alias ("strtoumax")))
 __cdecl
 strtoull (const char* __restrict__ nptr, char ** __restrict__ endptr, int 
base);
-unsigned long long (__cdecl *__MINGW_IMP_SYMBOL(strtoull))(const char* 
__restrict__, char ** __restrict__, int) = strtoull;
+extern unsigned long long __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(strtoumax)))))
+(__cdecl *__MINGW_IMP_SYMBOL(strtoull))(const char* __restrict__, char ** 
__restrict__, int);
 
 unsigned __int64 __attribute__ ((alias ("strtoumax")))
 __cdecl
 _strtoui64 (const char* __restrict__ nptr, char ** __restrict__ endptr, int 
base);
-unsigned __int64 (__cdecl *__MINGW_IMP_SYMBOL(_strtoui64))(const char* 
__restrict__, char ** __restrict__, int) = _strtoui64;
+extern unsigned __int64 __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(strtoumax)))))
+(__cdecl *__MINGW_IMP_SYMBOL(_strtoui64))(const char* __restrict__, char ** 
__restrict__, int);
diff --git a/mingw-w64-crt/stdio/atoll.c b/mingw-w64-crt/stdio/atoll.c
index 278c01cf9257..90081a1776ed 100644
--- a/mingw-w64-crt/stdio/atoll.c
+++ b/mingw-w64-crt/stdio/atoll.c
@@ -10,4 +10,4 @@ long long __cdecl atoll(const char * nptr) { return 
strtoll(nptr, NULL, 10); }
 long long (__cdecl *__MINGW_IMP_SYMBOL(atoll))(const char *) = atoll;
 
 __int64 __attribute__((alias("atoll"))) __cdecl _atoi64(const char * nptr);
-__int64 (__cdecl *__MINGW_IMP_SYMBOL(_atoi64))(const char *) = _atoi64;
+extern __int64 
__attribute__((alias(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(atoll))))) (__cdecl 
*__MINGW_IMP_SYMBOL(_atoi64))(const char *);
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to