How to compile a program with static libcurl?
This is how it looks with dynamic libcurl.
$ ldd test linux-vdso.so.1 (0x00007ffcca3aa000) libcurl.so.4 => /usr/lib64/libcurl.so.4 (0x00007f5536ed6000) libc.so.6 => /lib64/libc.so.6 (0x00007f5536b3e000) libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x00007f55368d3000) libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x00007f5536503000) libz.so.1 => /lib64/libz.so.1 (0x00007f55362ed000) /lib64/ld-linux-x86-64.so.2 (0x00007f5537138000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f55360e9000)
If you want to link only curl statically, do not use -static. Just add libcurl.a as one of the objects files or use -lcurl, you don't need to specify it twice.After
gcc test.c curl-7.44.0/lib/.libs/libcurl.a -lssl -lcrypto -ldl -lm -lz -DCURL_STATICLIB -o test
you'll get
$ ldd test linux-vdso.so.1 (0x00007ffd9a0a7000) libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x00007f947cc7e000) libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x00007f947c8ae000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f947c6aa000) libm.so.6 => /lib64/libm.so.6 (0x00007f947c3b1000) libz.so.1 => /lib64/libz.so.1 (0x00007f947c19b000) libc.so.6 => /lib64/libc.so.6 (0x00007f947be03000) /lib64/ld-linux-x86-64.so.2 (0x00007f947cee9000)
-static means that you want link all statically. Then you need all libraries prepared as static and the result will be:
$ ldd test not a dynamic executable
I found a way. libcurl must be configured with key "--enable-ares".
./configure --disable-shared --enable-static --prefix=/tmp/curl --disable-ldap --disable-sspi --without-librtmp --disable-ftp --disable-file --disable-dict --disable-telnet --disable-tftp --disable-rtsp --disable-pop3 --disable-imap --disable-smtp --disable-gopher --disable-smb --without-libidn --enable-ares
Then the program will feature gethostbyname and will be able to resolve the domain name.
Thank you all for the comments.