ldd utility

March 18, 2020

While playing with a binary, which happened to be openvpn, I discovered that I can’t run it, for a very misterious reason:

libcrypto.so.1.1: cannot open shared object file: No such file or directory

Obviously that means that a dynamic library the binary was linked went missing, but I needed more info about the matter.

Turns out there’s a tool that is able to tell you everything there is to know about a binary and the libraries it’s using. It’s called ldd and it’s great. With a simple ldd ./openvpn I was able to infer that much of useful insights about the issue that forced me to dig deeply:

$> ldd ./openvpn
  linux-vdso.so.1 =>  (0x00007ffd291c7000)
  liblzo2.so.2 => /lib/x86_64-linux-gnu/liblzo2.so.2 (0x00007f0932f11000)
  liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f0932cf9000)
  libcrypto.so.1.1 => not found
  libssl.so.1.1 => not found
  libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f0933571000)
  libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0932af5000)
  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f093272b000)
  libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f0932509000)
  librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f0932301000)
  liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f09320df000)
  libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f0931dfe000)
  libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0931be1000)
  /lib64/ld-linux-x86-64.so.2 (0x00007f09333eb000)
  libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f0931971000)
  libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f093175d000)

With its help I discovered that I have to missing libraries libssl.so.1.1 and libcrypto.so.1.1. Turns out they’re both provided by OpenSSL 1.1. Because I was not able to rely on openssl=1.1 being available on a lot of systems — I had to re-compile openvpn against OpenSSL 1.0.0 (also that was because statically linking openssl and openvpn is damn hard. Anyways, ldd was able to infer that the new binary uses openssl 1.0!

$> ldd ./openvpn
  linux-vdso.so.1 =>  (0x00007ffebbd73000)
  liblzo2.so.2 => /lib/x86_64-linux-gnu/liblzo2.so.2 (0x00007f7933703000)
  liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f79334eb000)
  libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f79330a6000)
  libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f7932e3d000)
  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7932a73000)
  libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f793286f000)
  /lib64/ld-linux-x86-64.so.2 (0x00007f7933925000)

What a small and great utility, do use it, it won’t ever lie to you.

Also, note that ldd is Linux only, but there’s a similar utility available on MacOS — it’s called otool.

Andrei Glingeanu

Andrei Glingeanu's notes and thoughts. You should follow him on Twitter, Instagram or contact via email. The stuff he loves to read can be found here on this site or on goodreads. Wanna vent or buy me a coffee?