Problem with differences with DLOPEN / DLSYM compared to ubuntu (16.04) / debian (stretch).

Jon Turney jon.turney@dronecode.org.uk
Fri Sep 15 16:59:00 GMT 2017


On 15/09/2017 17:07, cyg Simple wrote:
> Please consider using an interleaving method of posting on this list.
> Top posting is considered rude.
> 
> On 9/15/2017 9:51 AM, Gary Schneir wrote:
>> Thanks for the response but I am a little confused by it.  If Cygwin is
>> supposed to provide POSIX API functionality and DLOPEN / DLSYM are
>> supported in CYGWIN, then I shouldn't care about the underlying
>> complexity or restrictions of running within the Windows environment and
>> using DLLs.  The behavior should be the same as in other POSIX environments.
> 
> You presented your case well and I was waiting on someone familiar with
> the code to respond.  I'm not sure that would be Kaz, he was just trying
> to be helpful from his experiences.  I agree with your surmise that
> Cygwin should perform similar results as Linux in this case.

...

>> If you are saying that I did not include some sort of
>> __declspec(dllexport) directive in my code so that it can find my
>> symbols, that is something else but you indicate that you think cygwin
>> hides that complexity in shared libraries.
> 
> Actually it would be binutils, regardless of Cygwin or MinGW, that is
> trying to hide the complexity of needing to supply the
> __declspec([export|import]) declarations.  The logic for that is a bit
> confusing but if none is given then all symbols are exported.

You need to decorate the symbols you wish to be visible with 
'__attribute__ ((dllexport))' or '__declspec(dllexport)' (MSVC syntax 
which is also supported by gcc)

See [1] for an example of this done portably

[1] https://gcc.gnu.org/wiki/Visibility

Alternatively, you can use the ld flag --export-all-symbols (cf. with 
the ELF option --export-dynamic, which I think you must be using to get 
the observed behaviour on linux) to make all symbols visible.

Taking your example, and making it compilable:

$ cat dlopen.cc
#include <iostream>
#include <memory>
#include <dlfcn.h>

void * handle, * symbol;
const char * errorStr;

int main()
{
   /* get access to the executable's symbol table */
   handle = dlopen(NULL, RTLD_LAZY);
   errorStr = dlerror();

   if (errorStr)
     {
       std::clog << "dlopen error '" << errorStr << "'" << std::endl;
     }
   if (handle)
     {
       std::clog << "handle ok " << std::endl;
     }
   else
     {
       std::clog << "handle NULL " << std::endl;
     }

   /* look up the from_string function */
   symbol = dlsym(handle, "functionname");
   errorStr = dlerror();

   if (symbol)
     {
       std::clog << "dlsym symbol ok " << std::endl;
     }
   else
     {
       std::clog << "dlsym symbol NULL " << std::endl;
     }
   if (errorStr)
     {
       std::clog << "dlsym error '" << errorStr << "'" << std::endl;
     }
}

extern "C" __attribute__ ((dllexport))
void functionname()
{
}

$ g++ dlopen.cc -o dlopen

$ ./dlopen
handle ok
dlsym symbol ok


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list