How to get which PATH is available to a GUI application?

I need to understand which version of sqlite3 is used by a GUI app.

I have several versions installed on my machine and I want to know which one is available to MacOS GUI app. There must be a place which defines a PATH to the GUI apps.

How can I know ? How can I modify it?


Solution 1:

Assuming SQLite is dynamically linked into the running application, you can find the PATH environment variable using the ps command.

Alternatively, use Activity Monitor to view the application's Open Files and Ports. You can then search the output to see if the library is being held open by the process.

Path - Use ps

PATH is part of a process's environment variables. If you can see those, you will find PATH.

Use the ps tool with the flags -wwwE on macOS to view the environment variables passed to a process:

ps -p <PID> -wwwE

See Environment variables of a running process on Unix?

Example

Below is an example output from running this command on the graphical Mac application Xcode:

ps -p 1648 -wwwE

  PID TTY           TIME CMD
 1648 ??         0:03.46 /Applications/Xcode.app/Contents/MacOS/Xcode TMPDIR=/var/folders/b2/[redacted]n/T/ __CF_USER_TEXT_ENCODING=0x1F5:0x0:0x2 HOME=[redacted] SHELL=/bin/bash Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.[redacted]/Render SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.[redacted]/Listeners PATH=/usr/bin:/bin:/usr/sbin:/sbin LOGNAME=[redacted] DISPLAY=/private/tmp/com.apple.launchd.[redacted]/org.macosforge.xquartz:0 XPC_SERVICE_NAME=com.apple.dt.Xcode.64852 MallocNanoZone=0 USER=[redacted] XPC_FLAGS=0x1

As Mark mentions in a comment below, this may not show the linked library.

Linked Library Info - Use otool

As another alternative, try otool to extract the linked framework and library information. The command to run is:

otool -L <path to binary>

Using Xcode.app as an example, the command and output is:

$ otool -L /Applications/Xcode.app/Contents/MacOS/Xcode 
/Applications/Xcode.app/Contents/MacOS/Xcode:
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 22.0.0)
    @rpath/DVTFoundation.framework/Versions/A/DVTFoundation (compatibility version 1.0.0, current version 1.0.0)
    @rpath/DVTKit.framework/Versions/A/DVTKit (compatibility version 1.0.0, current version 1.0.0)
    @rpath/IDEFoundation.framework/Versions/A/IDEFoundation (compatibility version 1.0.0, current version 14154.0.0)
    @rpath/IDEKit.framework/Versions/A/IDEKit (compatibility version 1.0.0, current version 14154.0.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1452.20.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1561.40.104)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1452.20.0)
    @rpath/libswiftAVFoundation.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftCoreAudio.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftCoreGraphics.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftCoreImage.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftCoreMedia.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftDarwin.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftDispatch.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftFoundation.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftIOKit.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftMetal.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftObjectiveC.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftQuartzCore.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftXPC.dylib (compatibility version 1.0.0, current version 902.0.48)
    @rpath/libswiftsimd.dylib (compatibility version 1.0.0, current version 902.0.48)

Relinking

Relinking a binary is not advisable but seemingly possible. See How to copy (and relink) binaries on OSX using otool and install_name_tool for detailed instructions.