Skip Navigation

[Question] How to find which libraries an application uses?

Hello. I was wondering which command would allow me to know factually check which graphic library an application uses?

For instance, which UI library does telegram or firefox use? strace wouldn't work for that purpose as it deals with system calls, right? What about ltrace which works for library calls? I was able to find some gtk strings in the output of ltrace, but mostly strncmp(), strchr(), strlen(), memchr(), and one setenv(GTK_IM_MODULE, "gtk-im-context- simple"). Is that enough to conclude the process uses gtk?

It's a little verbose, so I wondered what about lsof to show open files. lsof -p <pid> shows me that the pid opens up libgtk-3.0.so... That seems conclusive enough, right? There wouldn't be any reason to open that libgtk-3.0.so shared object if it didn't use gtk?

Seems like lsof is better for getting this information rather than ltrace, right?

In the specific case of firefox, lsof does show that firefox uses libgtk-3.0.so as well as something called libmozgtk.so so I guess they don't fully use gtk, but their own thing as well?

In summary, what's the best and most reliable command to figure out which graphic library (QT, GTK, something else) an application uses? lsof?

Thanks

3
3 comments
  • Would ldd do what you want?

    EDIT: Had more time to look, and found out this would not work, at least for my distro. Using ldd may not work depending on how Firefox was compiled -- it works only if the library you are interested in is dynamically linked.

    For me, if I run command -v firefox, I get /usr/bin/firefox. Running ldd /usr/bin/firefox results in an error: not a dynamic executable. It turns out that, for me, /usr/bin/firefox is just a small script that calls /usr/lib/firefox/firefox. Running ldd on that file produces the following:

    linux-vdso.so.1 (0x00007ffe4e2e7000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f75eb400000)
    libm.so.6 => /usr/lib/libm.so.6 (0x00007f75eb318000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f75eb6ae000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007f75eb131000)
    /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f75eb7ba000)
    
    

    None of these look like a library of interest to you, so the library you want must have been statically linked.

    (As a side note, don't use ldd on an untrusted executable b/c it may run the executable to get the information.)

    In that case, if you really want to dig, you can try something like readelf to dump info about the executable. If you know what you're looking for (such as GTK), you might be able to grep for it. However, my version of Firefox has the symbol table stripped, so I don't think there's much else I can do.

    And of course, if you have open-source software, you can always just go check the source code :)

    • Thanks a lot for your reply, learned a lot of things!

      In Fedora /usr/bin/firefox also is a bash script so I ran into the same not a dynamic executable issue as well. readelf looks interesting, I'll have to play around with it.

  • It's not exactly bulletproof but running any program from the command line will throw an error if there's a missing dependency. Then it should be as simple as installing the dependencies through your package manager.