Search code examples
cygwinshared

Cygwin install does not have shared libraries, or how should I activate the shared libraries?


I'm new to Cygwin - so hopefully, someone can point me in the right direction. I would like to be able to choose to use the shared libraries to compile my code. However, so far, it seems that it always uses the static library, and I don't know where exactly I did wrong.

I installed Cygwin on my Windows 10 computer. Created a file: test.c, which contains:

    #include <stdio.h>

    const char msg[] = "Hello, world.";

    int main(void){
        puts (msg);
        return 0;
    }

I then compiled it with: $ gcc -Wall -c test.c -o test.o
Then I checked the symbols using: $ nm test.o

It gives me what I expected:

                 U __main
0000000000000000 T main
0000000000000000 R msg
                 U puts

where none of the symbols have been assigned addresses yet. This is all good.

Then, I linked it using the following: $ gcc -Wall test.o –o test

Then checked the symbols like below: $ nm test

I got the following:

0000000100401080 T main
0000000100401000 T mainCRTStartup
0000000100401640 T malloc
0000000100403000 R msg
0000000100401650 T posix_memalign
00000001004010d0 T puts

while I was expecting the symbol puts being something like U puts@@GLIBC_x.x.x`.

It seems like I did not have the shared libraries, or I'm not using the process correctly. What is wrong then? Thanks.


Solution

  • using objdump

    objdump -x test.exe 
    
            DLL Name: cygwin1.dll
            vma:  Hint/Ord Member-Name Bound-To
            813c       15  __cxa_atexit
            814c       46  __main
            8158      108  _dll_crt0
            8164      115  _impure_ptr
            8174      257  calloc
            8180      373  cygwin_detach_dll
            8194      375  cygwin_internal
            81a8      403  dll_dllcrt0
            81b8      579  free
            81c0      909  malloc
            81cc     1015  posix_memalign
            81e0     1170  puts
            81e8     1196  realloc
    

    so puts is an external symbol taken from cygwin1.dll shared lib