Linux动态链接库加载顺序

突然想到以前遇到的一个问题,动态链接库加载的问题。如果有多个动态链接库里面都有相同符号的函数,程序在执行时会优先执行那个动态链接库中的函数呢?

 

先给结论

动态链接库加载顺序:

1.可执行档同目录下的动态链接库;

2.编译时指定的动态链接库位置;

3.运行可执行档前使用LD_LIBRARY_PATH指定的动态链接库位置;

4./etc/ld.so.conf中指定的动态链接库位置;

5./lib中的动态链接库

6./usr/lib中的动态链接库

 

实验用到的源文件、头文件和CMakeList

hello.h

#ifndef __HELLO_H__

#define __HELLO_H__

 

void hello(void);

 

#endif

hello1.c

#include "hello.h"

#include <stdio.h>

 

void hello(void)

{

printf("This is hello 1!\n");

}

hello2.c

#include "hello.h"

#include <stdio.h>

 

void hello(void)

{

printf("This is hello 1!\n");

}

main.c

#include "hello.h"

#include <stdio.h>

 

void main(void)

{

hello();

}

CMakeList.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

 

GET_FILENAME_COMPONENT(ROOT_PATH ${CMAKE_SOURCE_DIR}/ REALPATH)

 

PROJECT (HELLO)

SET(SRC_LIST main.c)

SET(DYNAMIC_LIST1 hello1.c)

SET(DYNAMIC_LIST2 hello2.c)

 

INCLUDE_DIRECTORIES(${ROOT_PATH})

 

ADD_LIBRARY(hello1 SHARED ${DYNAMIC_LIST1})

ADD_LIBRARY(hello2 SHARED ${DYNAMIC_LIST2})

 

LINK_DIRECTORIES(${ROOT_PATH}/build/lib)

LINK_DIRECTORIES(${ROOT_PATH}/build/libs)

 

ADD_EXECUTABLE(main ${SRC_LIST})

 

TARGET_LINK_LIBRARIES(main hello1)

 

实验一:编译时不指定动态链接库位置

 

编译后直接运行输出:This is hello 1!

交换libhello1.solibhello2.so,运行输出:This is hello 2!

test1.log

 

实验二:编译时指定动态链接库位置

 

libhello1.solibhello2.so分别放在liblibs文件夹中并都改名为libhello1.so,运行发现

LINK_DIRECTORIES(lib)/LINK_DIRECTORIES(libs)的顺序会影响选择动态链接库的顺序,优先加载排在前面的动态链接库。

test2.log

 

实验三:编译时不指定动态链接库位置,运行前用LD_LIBRARY_PATH指定

 

libhello1.solibhello2.so分别放在liblibs文件夹中并都改名为libhello1.so(并作交换),运行发现优先加载最早填入LD_LIBRARY_PATH

test3.log

 

实验四:编译时指定动态链接库位置,运行前用LD_LIBRARY_PATH指定

 

libhello1.solibhello2.so分别放在liblibs文件夹中并都改名为libhello1.so(并作交换),再加入LD_LIBRARY_PATH,发现优先加载编译程序时指定的动态链接库,找不到再加载LD_LIBRARY_PATH中的动态链接库

 

test4.log

 

实验五:编译时指定动态链接库位置,但是执行档目录下有同名动态链接库

 

优先加载执行档同名路径下的动态链接库

 

test5.log

 

查看编译时是否指定动态链接库位置

$readelf -d main

l 编译时没有指定动态链接库位置

yangfan@ubuntu:~/Workspace/CMake_dynamic/build$ readelf -d main 

 

Dynamic section at offset 0xe08 contains 26 entries:

  Tag        Type                         Name/Value

 0x0000000000000001 (NEEDED)             Shared library: [libhello1.so]

 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

 0x000000000000000f (RPATH)              Library rpath: [/home/yangfan/Workspace/CMake_dynamic/build]

l 编译时指定动态链接库位置

yangfan@ubuntu:~/Workspace/CMake_dynamic/build$ readelf -d main 

 

Dynamic section at offset 0xe08 contains 26 entries:

  Tag        Type                         Name/Value

 0x0000000000000001 (NEEDED)             Shared library: [libhello1.so]

 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

 0x000000000000000f (RPATH)              Library rpath: [/home/yangfan/Workspace/CMake_dynamic/build/lib:/home/yangfan/Workspace/CMake_dynamic/build]

编译时指定动态链接库位置的话Library rpath一般会有多于一个的路径

查看程序将会加载哪个动态链接库

$ldd main

 

yangfan@ubuntu:~/Workspace/CMake_dynamic$ ldd main

linux-vdso.so.1 =>  (0x00007fff1aff6000)

libhello1.so => /home/yangfan/Workspace/CMake_dynamic/build/libhello1.so (0x00007f2f03e38000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2f03a50000)

/lib64/ld-linux-x86-64.so.2 (0x000055d2cfdfa000)

 

转载于:https://www.cnblogs.com/FanZZ/p/6658659.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态链接库劫持(Dynamic Link Library Hijacking),也称为DLL劫持,是一种恶意攻击技术,利用系统在加载可执行文件时搜索和加载动态链接库的方式进行攻击。攻击者通过在系统中放置恶意的动态链接库文件,并将其命名为被目标程序所依赖的动态链接库文件名,从而使目标程序加载动态链接库加载到了恶意代码。 当目标程序启动时,系统会按照一定的搜索顺序查找和加载所需的动态链接库。攻击者利用这个搜索顺序的漏洞,将恶意的动态链接库文件放置在搜索路径上,并命名为被目标程序所依赖的动态链接库文件名,使得目标程序加载到了恶意代码。 通过DLL劫持攻击,攻击者可以执行恶意代码,获取目标系统的敏感信息,甚至完全控制目标系统。为了防止DLL劫持攻击,开发者需要注意使用绝对路径或者强制使用指定版本的动态链接库加载,以避免加载到恶意的动态链接库文件。 在Linux系统中,可以采取以下几种方式来防止DLL劫持攻击: 1. 使用绝对路径加载动态链接库:在程序中指定动态链接库的绝对路径,确保只加载指定路径下的动态链接库。 2. 使用rpath或rpath-link选项:在编译链接时,可以使用rpath或rpath-link选项指定动态链接库的搜索路径,避免使用默认搜索路径。 3. 使用LD_LIBRARY_PATH环境变量:通过设置LD_LIBRARY_PATH环境变量,指定动态链接库的搜索路径,使得程序加载指定路径下的动态链接库。 4. 使用静态链接库:将动态链接库编译为静态链接库,以避免加载动态链接库时的搜索过程。 请注意,以上方法只是一些常见的防御措施,但并不能完全防止DLL劫持攻击。开发者在编写代码时应该考虑到安全性,并采取适当的防御措施来减少风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值