I somehow sent it before attaching the files :S
Makefile
Description: Binary data
#include <stdlib.h> #include "ltdl.h"
#ifdef STDCALL #define MODULE_STDCALL __stdcall #define MODULE_SUFFIX "_stdcall" #else #define MODULE_STDCALL #define MODULE_SUFFIX "" #endif #define module_foo (*module_foo_p) static int MODULE_STDCALL module_foo (); static lt_dlhandle module; int main (void) { LTDL_SET_PRELOADED_SYMBOLS(); lt_dlinit (); lt_dlsetsearchpath(".libs"); module = lt_dlopenext ("libmodule" MODULE_SUFFIX); if (module == NULL) module = lt_dlopen ("libmodule" MODULE_SUFFIX ".a"); if (module == NULL) { puts (lt_dlerror ()); lt_dlexit (); exit (EXIT_FAILURE); } *(void **) (&module_foo_p) = lt_dlsym (module, "module_foo"); module_foo (); exit (EXIT_SUCCESS); }
#include <stdio.h> #ifdef STDCALL #define MODULE_STDCALL __stdcall #else #define MODULE_STDCALL #endif /* Dummy sumbol to ensure table is generated. */ int dummy; int MODULE_STDCALL module_foo (int x, int y) { printf("foo\n"); }
--- libtool.old 2018-08-08 08:03:29 +0000 +++ libtool 2018-08-08 11:48:34 +0000 @@ -167,10 +167,10 @@ LTCFLAGS="-O3 -s -mms-bitfields -march=i386 -mtune=i686" # Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*_\\([_A-Za-z][_A-Za-z0-9]*\\)\\{0,1\\}\$/\\1 _\\2 \\2/p' | sed '/ __gnu_lto/d'" +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*_\\(\\([_A-Za-z][_A-Za-z0-9]*\\)\\(@[0-9][0-9]*\\)\\?\\)\\{0,1\\}\$/\\1 _\\2 \\3/p' | sed '/ __gnu_lto/d'" # Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[ABCDGIRSTW]* .* \\(.*\\)\$/extern char \\1;/p'" +global_symbol_to_cdecl="(sed -n -e 's/^T .*@\\([0-9][0-9]*\\) \\(.*\\)\$/extern int __stdcall \\2(@\\1@);/p' -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[ABCDGIRSTW]* .* \\(.*\\)\$/extern char \\1;/p' | awk -F @ '{printf(\$1); if (\$2 > 0) {printf(\"int\"); for (i=4; i < \$2; i=i+4) {printf(\", int\")}}; printf(\$3)}')" # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\)[ ]*\$/ {\\\"\\1\\\", (void *) 0},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (void *) \\&\\2},/p'"
csanchez...@gmail.com (Carlos Sánchez de La Lama) writes: > Hi all, > > it seems stdcall function decorations prevent those symbols to be > recognized in func_generate_dlsyms. I attach a small example of this > (only can be replicated on win32 hosts, I am using mingw32). > > The makefile generates 4 files: > loader -> works > loader_static -> works (dlpreloads the module) > loader_stdcall -> works (uses stdcall but no dlpreloads) > loader_stdcall_static -> segfaults (module_foo symbol is not there) > > I also attach a patch for main libtool script that makes it work. I am > going to prepare a proper patch over HEAD libtool.m4, but if anyone has > any comments please let me know. > > BR > > Carlos -- Carlos
_______________________________________________ https://lists.gnu.org/mailman/listinfo/libtool