/etc/profile中配置LD_LIBRARY_PATH不生效问题分析

本文深入探讨了Linux环境下LD_LIBRARY_PATH配置的常见问题与解决策略,包括配置失效的原因分析及如何确保服务能正确使用共享库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LIBRARY_PATH与LD_LIBRARY_PATH

  • LIBRARY_PATH为编译链接时查找动态链接库使用的路径

    • gcc 文件 -lpthread这里可以不跟动态链接库路径,若动态库在/lib/usr/lib中,可以不带动态库路径

    • gcc 文件 -lmul 这里的mul动态库是自己的动态库,若没有放在/lib/usr/lib中,也没有配置LIBRARY_PATH会提示找不到。

      gcc UTSP16.c -o U16 -lmul
      /usr/bin/ld: 找不到 -lmul
      collect2: error: ld returned 1 exit status
      

      gcc使用-I指定动态库头文件目录,-L指定动态库路径,就可以链接到

       gcc UTSP16.c -o U16 -lmul -I /home/kylin/Multiple/lib/ -L /home/kylin//Multiple/lib/
      
    • 将动态库路径配置到LIBRARY_PATH中,gcc也可以链接到

  • LD_LIBRARY_PATH为程序运行时查找动态链接库使用的路径

    运行二进制文件时,动态链接库的查找路径

    1、编译目标代码时指定的动态库搜索路径:用选项-Wl,rpath和include指定的动态库的搜索路径,比如gcc -Wl,-rpath,include -L. -ldltest hello.c,在执行文件时会搜索路径`./include`;
    2、环境变量LD_LIBRARY_PATH(多个路径用冒号分割);
    3、在 /etc/ld.so.conf.d/ 目录下的配置文件指定的动态库绝对路径(通过ldconfig生效,一般是非root用户时使用);
    4、gcc默认动态库目录:/lib:/usr/lib:usr/lib64:/usr/local/lib等。
    

问题复现

使用ldd -d命令查看程序UTSP16的动态库,可以看到libmul.so => /usr/lib/libmul.so (0x00007fe5131af000)

kylin@Kylin:~/Multiple/test$ ldd -d UTSP16
	linux-vdso.so.1 =>  (0x00007ffef7af2000)
	libmul.so => /usr/lib/libmul.so (0x00007fe5131af000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe512de5000)
	/lib64/ld-linux-x86-64.so.2 (0x00005576174e5000)

使用rm删除/usr/lib/中关于libmul相关的软连接与库。使用ldd -d查看发现libmul.so => not found,而后运行UTSP16

kylin@Kylin:~/Multiple/test$ ldd -d UTSP16
	linux-vdso.so.1 =>  (0x00007ffce35f7000)
	libmul.so => not found
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f53f865b000)
	/lib64/ld-linux-x86-64.so.2 (0x000055e36e152000)
kylin@Kylin:~/Multiple/test$ ./UTSP16
./UTSP16: error while loading shared libraries: libmul.so: cannot open shared object file: No such file or directory

/etc/profile加入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/kylin/Multiple/lib,执行source /etc/profile,运行UTSP16,发现运行时依然找不到动态库,配置无效。

kylin@Kylin:~/Multiple/test$ ldd -d UTSP16
	linux-vdso.so.1 =>  (0x00007ffce35f7000)
	libmul.so => not found  即使配置了LD_LIBRARY_PATH,执行`source  /etc/profile`还是没有找到
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f53f865b000)
	/lib64/ld-linux-x86-64.so.2 (0x000055e36e152000)
kylin@Kylin:~/Multiple/test$ ./UTSP16
./UTSP16: error while loading shared libraries: libmul.so: cannot open shared object file: No such file or directory

分析1:是否执行source /etc/profile

输出$LD_LIBRARY_PATH的值,发现有内容,且是自己当时的配置。

kylin@Kylin:~/Multiple/test$ echo $LD_LIBRARY_PATH 
:/home/kylin/Multiple/lib

分析2:LD_LIBRARY_PATH中配置的目录是否正确

echo $LD_LIBRARY_PATH查看配置,ll /home/kylin/Multiple/lib查看路径下是否存在动态共享库,发现存在-rwxr-xr-x 1 root root 52848 4月 8 10:44 libmul.so.1*,说明配置的共享库路径是对的。

kylin@Kylin:~/Multiple/test$ echo $LD_LIBRARY_PATH 
:/home/kylin/Multiple/lib
kylin@Kylin:~/Multiple/test$ ll /home/kylin/Multiple/lib
总用量 212
drwxrwxr-x 3 kylin kylin  4096 4月   8 10:44 ./
drwxrwxr-x 7 kylin kylin  4096 4月   3 10:13 ../
-rw-r--r-- 1 root  root  40320 4月   8 10:44 cJSON.o
-rw-r--r-- 1 kylin kylin 10396 4月   3 10:56 common.c
-rw-rw-r-- 1 kylin kylin   113 4月   3 10:56 common.d
-rw-r--r-- 1 kylin kylin  3627 4月   3 10:56 common.h
-rw-r--r-- 1 root  root   8704 4月   8 10:44 common.o
drwxrwxr-x 2 kylin kylin  4096 4月   3 10:13 json/
-rw-r--r-- 1 root  root  13248 4月   8 10:44 libmul.a
-rwxr-xr-x 1 root  root  52848 4月   8 10:44 libmul.so.1* 只有共享库,没有共享库的软连接
-rw-r--r-- 1 kylin kylin   904 4月   3 10:56 Makefile
-rw-rw-r-- 1 kylin kylin 10404 4月   3 10:56 mulserv.c
-rw-rw-r-- 1 kylin kylin   194 4月   3 10:56 mulserv.d
-rw-rw-r-- 1 kylin kylin  4859 4月   3 10:56 mulserv.h
-rw-r--r-- 1 root  root  12968 4月   8 10:44 mulserv.o
-rw-rw-r-- 1 kylin kylin  2606 4月   3 10:56 mulswitch.c
-rw-rw-r-- 1 kylin kylin   162 4月   3 10:56 mulswitch.d
-rw-rw-r-- 1 kylin kylin   830 4月   3 10:56 mulswitch.h
-rw-r--r-- 1 root  root   2272 4月   8 10:44 mulswitch.o

分析3:LD_LIBRARY_PATH中配置的目录,里面的动态库是否创建了软连接,若共享库没有创建软连接,也会找不到。

使用ll /home/kylin/Multiple/lib查看路径下是否存在动态共享库,发现只存在-rwxr-xr-x 1 root root 52848 4月 8 10:44 libmul.so.1*,而没有libmul.so.1的软连接。

使用ln -s ../lib/libmul.so.1 ../lib/libmul.solibmul.so.1创建软连接。

kylin@Kylin:~/Multiple/test$ ln -s ../lib/libmul.so.1 ../lib/libmul.so
kylin@Kylin:~/Multiple/test$ ll /home/kylin/Multiple/lib
总用量 212
drwxrwxr-x 3 kylin kylin  4096 4月   8 13:39 ./
drwxrwxr-x 7 kylin kylin  4096 4月   3 10:13 ../
-rw-r--r-- 1 root  root  40320 4月   8 10:44 cJSON.o
-rw-r--r-- 1 kylin kylin 10396 4月   3 10:56 common.c
-rw-rw-r-- 1 kylin kylin   113 4月   3 10:56 common.d
-rw-r--r-- 1 kylin kylin  3627 4月   3 10:56 common.h
-rw-r--r-- 1 root  root   8704 4月   8 10:44 common.o
drwxrwxr-x 2 kylin kylin  4096 4月   3 10:13 json/
-rw-r--r-- 1 root  root  13248 4月   8 10:44 libmul.a
lrwxrwxrwx 1 kylin kylin    18 4月   8 13:39 libmul.so -> ../lib/libmul.so.1* 刚创建的软连接
-rwxr-xr-x 1 root  root  52848 4月   8 10:44 libmul.so.1* 共享库
-rw-r--r-- 1 kylin kylin   904 4月   3 10:56 Makefile
-rw-rw-r-- 1 kylin kylin 10404 4月   3 10:56 mulserv.c
-rw-rw-r-- 1 kylin kylin   194 4月   3 10:56 mulserv.d
-rw-rw-r-- 1 kylin kylin  4859 4月   3 10:56 mulserv.h
-rw-r--r-- 1 root  root  12968 4月   8 10:44 mulserv.o
-rw-rw-r-- 1 kylin kylin  2606 4月   3 10:56 mulswitch.c
-rw-rw-r-- 1 kylin kylin   162 4月   3 10:56 mulswitch.d
-rw-rw-r-- 1 kylin kylin   830 4月   3 10:56 mulswitch.h
-rw-r--r-- 1 root  root   2272 4月   8 10:44 mulswitch.o

在创建完共享库的软连接后,使用ldd -d UTS16查看,发现已经可以找到了,LD_LIBRARY_PATH的配置生效

kylin@Kylin:~/Multiple/test$ ldd -d UTSP16
	linux-vdso.so.1 =>  (0x00007ffeab7f9000)
	libmul.so => /home/kylin/Multiple/lib/libmul.so (0x00007f3de2d7e000) 这里不再是not found,而是刚创建的软连接
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3de29a0000)
	/lib64/ld-linux-x86-64.so.2 (0x00005569ec01b000)

分析4:用户登录才执行/etc/profile(直接运行程序可以,sudo运行程序找不到共享库)

查看现象:ldd -d /usr/bin/mulprocsudo ldd -d /usr/bin/mulproc

/etc/profile加入export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/kylin/Multiple/lib

当前用户为kylin,输出$LD_LIBRARY_PATH

kylin@kylin-X280:~$ echo $LD_LIBRARY_PATH 
:/home/kylin/Multiple/lib/
kylin@kylin-X280:~$ 

使用su进入root,输出$LD_LIBRARY_PATH为空。直接执行mulproc是可以找到共享库,在kylin用户下使用sudo执行mulproc是找不到共享库的。

root@kylin-X280:/home/kylin# echo $LD_LIBRARY_PATH

root@kylin-X280:/home/kylin# 
  • 使用ldd -d /usr/bin/mulproc查看,发现libmul.so => /home/kylin/Multiple/lib/libmul.so (0x00007f324700a000)

    kylin@kylin-X280:~$  ldd -d /usr/bin/mulproc 
    linux-vdso.so.1 (0x00007ffc797bf000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f324703b000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3247018000)
    libmul.so => /home/kylin/Multiple/lib/libmul.so (0x00007f324700a000)  说明配置成功
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3246e19000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3247070000)
    
  • 使用sudo ldd -d /usr/bin/mulproc查看,发现libmul.so => not found,可见配置对kylin用户生效,对root没有生效。

    kylin@kylin-X280:~$ sudo ldd -d /usr/bin/mulproc 
        linux-vdso.so.1 (0x00007ffca98df000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f7811634000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7811611000)
        libmul.so => not found 这时又找不到了
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7811420000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f7811669000)
    undefined symbol: already_running	(/usr/bin/mulproc)
    

分析原因:/etc/profile的执行过程

  • /etc/profile与登录用户有关,每次用户登录才会执行。若没有用户登录,却又要运行相关程序,无法找到该环境变量。
  • sudo执行,使用的环境变量只是继承了前面用户env的环境变量,使用env查看环境变量,并没有export出来的LD_LIBRARY_PATH。所以找不到LD_LIBRARY_PATH
  • 登录的用户是kylin,使用sudosusu root都是不会执行/etc/profile,找不到LD_LIBRARY_PATH
  • 使用susu root也只是切换用户,并不会执行/etc/profile,使用su -root登录才会执行/etc/profile

解决方法:将LD_LIBRARY_PATH放入/etc/environment文件中

/etc/environment的执行与用户登录无关,在/etc/environment中加入LD_LIBRARY_PATH="/home/kylin/Multiple/lib"

kylin@kylin-X280:~$ cat /etc/environment
LD_LIBRARY_PATH="/home/kylin/Multiple/lib"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

重启后,使用ldd -d /usr/bin/mulprocsudo ldd -d /usr/bin/mulproc查看,都可以看到libmul.so => /home/kylin/Multiple/lib/libmul.so (0x00007f324700a000)

若还是不行,网上说,同时编辑/etc/X11/Xsession.options文件,将use-ssh-agent更改为no-use-ssh-agent


分析5:Linux service无法使用系统环境变量问题

查看现象:service启动失败,找不到共享库

/etc/environment/etc/profile中配置了LD_LIBRARY_PATH,使用echo $LD_LIBRARY_PATH可以看到值,使用ldd -d也可以配置的共享库。但是service启动失败,找不到共享库。

例如执行mulservice start,启动mulservice服务。这时启动服务失败,查看/var/log/syslog,提示找不到共享库(这里的mulservice为自己写的一主多备服务,非系统自带)。

kylin@kylin-X280:~$ mulservice start
Job for mulservice.service failed because the control process exited with error code.
See "systemctl status mulservice.service" and "journalctl -xe" for details.
 failed! `这时启动服务失败`
kylin@kylin-X280:~$ mulservice status
● mulservice.service - LSB: mulproc server
   Loaded: loaded (/etc/init.d/mulservice; generated)
   Active: failed (Result: exit-code) since Thu 2020-04-09 13:16:34 CST; 3min 20s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1261 ExecStart=/etc/init.d/mulservice start (code=exited, status=127)
4月 09 13:16:34 kylin-X280 systemd[1]: Starting LSB: mulproc server...
4月 09 13:16:34 kylin-X280 mulservice[1261]: /usr/bin/mulproc: error while lo…ory
4月 09 13:16:34 kylin-X280 systemd[1]: mulservice.service: Control process e…/n/a
4月 09 13:16:34 kylin-X280 systemd[1]: mulservice.service: Failed with resul…de'.
4月 09 13:16:34 kylin-X280 systemd[1]: Failed to start LSB: mulproc server.
tail -f /var/log/syslog
Apr  9 13:15:37 kylin-X280 systemd[1]: Stopping LSB: mulproc server...
Apr  9 13:15:37 kylin-X280 systemd[1]: mulservice.service: Succeeded.
Apr  9 13:15:37 kylin-X280 systemd[1]: Stopped LSB: mulproc server.
Apr  9 13:16:34 kylin-X280 systemd[1]: Starting LSB: mulproc server...
Apr  9 13:16:34 kylin-X280 mulservice[1261]: /usr/bin/mulproc: error while loading shared libraries: libmul.so: cannot open shared object file: No such file or directory `查看日志,还是提示找不到共享库,说明配置的LD_LIBRARY_PATH没有起到作用。`

分析原因:service服务无法使用系统环境变量,会把大部分环境变量去掉

service运行指定服务(称之为System V初始脚本)时,把大部分环境变量去掉了,只保留TERMPATHLANG等少数变量,并且把当前路径置为/,也就是说是在一个可以预测的非常干净的环境中运行服务脚本。这种脚本保存在/etc/init.d目录中,它至少要支持start和stop命令。

虽然在/etc/environment/etc/profile中配置了LD_LIBRARY_PATH,但是service把大部分环境变量去掉,包括LD_LIBRARY_PATH,所以在运行service服务时,是无法根据配置的LD_LIBRARY_PATH找到共享库的。

解决方法:修改/etc/init.d/服务脚步,加入环境变量

例如修改/etc/init.d/mulservice,在脚步中加入export LD_LIBRARY_PATH=/home/kylin/Multiple/lib/

#!/bin/sh
### BEGIN INIT INFO
# Provides:          mulservice
# Required-Start:    $local_fs $remote_fs $network $syslog $named
# Required-Stop:     $local_fs $remote_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Interactive:     true
# Short-Description: mulproc server
# Description:       Start mulproc server
#  This script will start the mulproc server.
### END INIT INFO

DESC="mulproc server"

#由于service会去掉大部分的环境变量,在这里加入LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/home/kylin/Multiple/lib/

set -e

. /lib/lsb/init-functions
[ -x /usr/bin/mulproc ] || exit 0
.........................................................

执行mulservice start,可以正常启动

kylin@kylin-X280:~$ mulservice start
[....] Starting mulservice (via systemctl): mulservice.serviceWarning: The unit file, source configuration file or drop-ins of mulservice.service changed on disk. Run 'systemctl daemon-reload' to reload units.
. ok
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值