Martin, patch looks ok. Be careful about the static symbol in custom section that it is actually present in a finally linked version. Sometimes gcc thinks ... that it can optimize away such static symbols. I had to introduce for that dummy references to such symbols in the past. See crt/* folder for that.
Cheers, Kai 2017-11-23 10:43 GMT+01:00 Martin Storsjö <[email protected]>: > When linking a DLL without using dllexport attributes or a def > file, all global symbols are exported, unless they are excluded > for one reason or another. GNU ld has got a list of libraries and > object files to exclude, so any symbols from e.g. libmingwex or > libmingw32 or dllcrt2.o won't get exported. > > However, libmsvcrt is missing from that list (and libucrtbase > obviously isn't present either). In LLD, libmsvcrt and libucrtbase > are part of the library exclude list. > > By linking with -Wl,--exclude-libs,libucrtbase.a, one can manually > request to exclude any symbols from this library. > > There are a number of exceptions to the rules for autoexporting > (which aren't clearly documented but can be found in ld/pe-dll.c > in GNU binutils). One that seems to cover the cases that currently > are found in libmsvcrt.a, explaining why such symbols haven't > been exported before, is that a symbol foo won't be exported, if a > corresponding symbol __imp_foo also is defined. > > We can use this to add __imp_ prefixed symbols for symbols that > strictly don't need it (where no calling code currently refers to > it with a dllimport attribute). > > Make the _CRTALLOC pointer static with an attribute indicating that > it is used and should be kept even though unreferenced. > > All in all, this avoids exporting unintentional symbols from DLLs > that link to ucrtbase, even though it might be desireable to > add libmsvcrt and libucrtbase to the built-in exclude list as well. > > Signed-off-by: Martin Storsjö <[email protected]> > --- > mingw-w64-crt/crt/ucrtbase_compat.c | 16 +++++++++++++++- > mingw-w64-crt/stdio/ucrt__vsnprintf.c | 1 + > mingw-w64-crt/stdio/ucrt_fprintf.c | 1 + > mingw-w64-crt/stdio/ucrt_printf.c | 1 + > mingw-w64-crt/stdio/ucrt_snprintf.c | 1 + > mingw-w64-crt/stdio/ucrt_sprintf.c | 1 + > mingw-w64-crt/stdio/ucrt_vfprintf.c | 1 + > mingw-w64-crt/stdio/ucrt_vprintf.c | 1 + > mingw-w64-crt/stdio/ucrt_vsnprintf.c | 1 + > mingw-w64-crt/stdio/ucrt_vsprintf.c | 1 + > 10 files changed, 24 insertions(+), 1 deletion(-) > > diff --git a/mingw-w64-crt/crt/ucrtbase_compat.c > b/mingw-w64-crt/crt/ucrtbase_compat.c > index 53e44f6..9d580df 100644 > --- a/mingw-w64-crt/crt/ucrtbase_compat.c > +++ b/mingw-w64-crt/crt/ucrtbase_compat.c > @@ -153,7 +153,7 @@ static void __cdecl init_compat_dtor(void) > atexit(free_locks); > } > > -_CRTALLOC(".CRT$XID") _PVFV mingw_ucrtbase_compat_init = init_compat_dtor; > +static _CRTALLOC(".CRT$XID") __attribute__((__used__)) _PVFV > mingw_ucrtbase_compat_init = init_compat_dtor; > > > // These are required to provide the unrepfixed data symbols "timezone" > @@ -226,6 +226,20 @@ int __cdecl __ms_fwprintf(FILE *file, const wchar_t > *fmt, ...) > va_end(ap); > return ret; > } > + > +// Dummy/unused __imp_ wrappers, to make GNU ld not autoexport these symbols. > +int __cdecl (*__MINGW_IMP_SYMBOL(__getmainargs))(int *, char ***, char ***, > int, _startupinfo *) = __getmainargs; > +int __cdecl (*__MINGW_IMP_SYMBOL(__wgetmainargs))(int *, wchar_t ***, > wchar_t ***, int, _startupinfo *) = __wgetmainargs; > +_onexit_t __cdecl (*__MINGW_IMP_SYMBOL(__dllonexit))(_onexit_t, _PVFV**, > _PVFV**) = __dllonexit; > +void __cdecl (*__MINGW_IMP_SYMBOL(_amsg_exit))(int) = _amsg_exit; > +unsigned int __cdecl (*__MINGW_IMP_SYMBOL(_get_output_format))(void) = > _get_output_format; > +void __cdecl (*__MINGW_IMP_SYMBOL(_tzset))(void) = _tzset; > +void __cdecl (*__MINGW_IMP_SYMBOL(tzset))(void) = tzset; > +void __cdecl (*__MINGW_IMP_SYMBOL(_lock))(int) = _lock; > +void __cdecl (*__MINGW_IMP_SYMBOL(_unlock))(int) = _unlock; > +int __cdecl (*__MINGW_IMP_SYMBOL(fwprintf))(FILE *, const wchar_t *, ...) = > fwprintf; > +int __cdecl (*__MINGW_IMP_SYMBOL(_snwprintf))(wchar_t *restrict, size_t, > const wchar_t *restrict, ...) = _snwprintf; > +int __cdecl (*__MINGW_IMP_SYMBOL(__ms_fwprintf))(FILE *, const wchar_t *, > ...) = __ms_fwprintf; > #ifdef __GNUC__ > #pragma GCC diagnostic pop > #endif > diff --git a/mingw-w64-crt/stdio/ucrt__vsnprintf.c > b/mingw-w64-crt/stdio/ucrt__vsnprintf.c > index 6828007..58f29f1 100644 > --- a/mingw-w64-crt/stdio/ucrt__vsnprintf.c > +++ b/mingw-w64-crt/stdio/ucrt__vsnprintf.c > @@ -12,3 +12,4 @@ int __cdecl _vsnprintf(char * __restrict__ _Dest,size_t > _Count,const char * __re > { > return > __stdio_common_vsprintf(UCRTBASE_PRINTF_LEGACY_VSPRINTF_NULL_TERMINATION, > _Dest, _Count, _Format, NULL, _Args); > } > +int __cdecl (*__MINGW_IMP_SYMBOL(_vsnprintf))(char *__restrict__, size_t, > const char *__restrict__, va_list) = _vsnprintf; > diff --git a/mingw-w64-crt/stdio/ucrt_fprintf.c > b/mingw-w64-crt/stdio/ucrt_fprintf.c > index 021a12a..f61e002 100644 > --- a/mingw-w64-crt/stdio/ucrt_fprintf.c > +++ b/mingw-w64-crt/stdio/ucrt_fprintf.c > @@ -17,3 +17,4 @@ int __cdecl fprintf(FILE * __restrict__ _File,const char * > __restrict__ _Format, > __builtin_va_end(ap); > return ret; > } > +int __cdecl (*__MINGW_IMP_SYMBOL(fprintf))(FILE *__restrict__, const char > *__restrict__, ...) = fprintf; > diff --git a/mingw-w64-crt/stdio/ucrt_printf.c > b/mingw-w64-crt/stdio/ucrt_printf.c > index d4a6e82..3cbacd7 100644 > --- a/mingw-w64-crt/stdio/ucrt_printf.c > +++ b/mingw-w64-crt/stdio/ucrt_printf.c > @@ -17,3 +17,4 @@ int __cdecl printf(const char * __restrict__ _Format,...) > __builtin_va_end(ap); > return ret; > } > +int __cdecl (*__MINGW_IMP_SYMBOL(printf))(const char *__restrict__, ...) = > printf; > diff --git a/mingw-w64-crt/stdio/ucrt_snprintf.c > b/mingw-w64-crt/stdio/ucrt_snprintf.c > index 4ef7761..893e182 100644 > --- a/mingw-w64-crt/stdio/ucrt_snprintf.c > +++ b/mingw-w64-crt/stdio/ucrt_snprintf.c > @@ -17,3 +17,4 @@ int snprintf (char * __restrict__ __stream, size_t __n, > const char * __restrict_ > __builtin_va_end(ap); > return ret; > } > +int __cdecl (*__MINGW_IMP_SYMBOL(snprintf))(char *__restrict__, size_t, > const char *__restrict__, ...) = snprintf; > diff --git a/mingw-w64-crt/stdio/ucrt_sprintf.c > b/mingw-w64-crt/stdio/ucrt_sprintf.c > index 74d665d..b9029d5 100644 > --- a/mingw-w64-crt/stdio/ucrt_sprintf.c > +++ b/mingw-w64-crt/stdio/ucrt_sprintf.c > @@ -17,3 +17,4 @@ int __cdecl sprintf(char * __restrict__ _Dest,const char * > __restrict__ _Format, > __builtin_va_end(ap); > return ret; > } > +int __cdecl (*__MINGW_IMP_SYMBOL(snprintf))(char *__restrict__, const char > *__restrict__, ...) = sprintf; > diff --git a/mingw-w64-crt/stdio/ucrt_vfprintf.c > b/mingw-w64-crt/stdio/ucrt_vfprintf.c > index 71cbb0d..801229f 100644 > --- a/mingw-w64-crt/stdio/ucrt_vfprintf.c > +++ b/mingw-w64-crt/stdio/ucrt_vfprintf.c > @@ -12,3 +12,4 @@ int __cdecl vfprintf(FILE * __restrict__ _File,const char * > __restrict__ _Format > { > return __stdio_common_vfprintf(0, _File, _Format, NULL, _ArgList); > } > +int __cdecl (*__MINGW_IMP_SYMBOL(vfprintf))(FILE *__restrict__, const char > *__restrict__, va_list) = vfprintf; > diff --git a/mingw-w64-crt/stdio/ucrt_vprintf.c > b/mingw-w64-crt/stdio/ucrt_vprintf.c > index 20b8881..0f7ef28 100644 > --- a/mingw-w64-crt/stdio/ucrt_vprintf.c > +++ b/mingw-w64-crt/stdio/ucrt_vprintf.c > @@ -12,3 +12,4 @@ int __cdecl vprintf(const char * __restrict__ > _Format,va_list _ArgList) > { > return __stdio_common_vfprintf(0, stdout, _Format, NULL, _ArgList); > } > +int __cdecl (*__MINGW_IMP_SYMBOL(vprintf))(const char *__restrict__, > va_list) = vprintf; > diff --git a/mingw-w64-crt/stdio/ucrt_vsnprintf.c > b/mingw-w64-crt/stdio/ucrt_vsnprintf.c > index f1b5a94..0e0fcfb 100644 > --- a/mingw-w64-crt/stdio/ucrt_vsnprintf.c > +++ b/mingw-w64-crt/stdio/ucrt_vsnprintf.c > @@ -12,3 +12,4 @@ int vsnprintf (char * __restrict__ __stream, size_t __n, > const char * __restrict > { > return > __stdio_common_vsprintf(UCRTBASE_PRINTF_STANDARD_SNPRINTF_BEHAVIOUR, > __stream, __n, __format, NULL, __local_argv); > } > +int __cdecl (*__MINGW_IMP_SYMBOL(vsnprintf))(char *__restrict__, size_t, > const char *__restrict__, va_list) = vsnprintf; > diff --git a/mingw-w64-crt/stdio/ucrt_vsprintf.c > b/mingw-w64-crt/stdio/ucrt_vsprintf.c > index d335240..3214ef9 100644 > --- a/mingw-w64-crt/stdio/ucrt_vsprintf.c > +++ b/mingw-w64-crt/stdio/ucrt_vsprintf.c > @@ -12,3 +12,4 @@ int __cdecl vsprintf(char * __restrict__ _Dest,const char * > __restrict__ _Format > { > return > __stdio_common_vsprintf(UCRTBASE_PRINTF_STANDARD_SNPRINTF_BEHAVIOUR, _Dest, > (size_t)-1, _Format, NULL, _Args); > } > +int __cdecl (*__MINGW_IMP_SYMBOL(vsprintf))(char *__restrict__, const char > *__restrict__, va_list) = vsprintf; > -- > 2.7.4 > > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Mingw-w64-public mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/mingw-w64-public ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
