Linux c 运行时获取动态库所在路径的操作方法2025-06-27

运行时获取动态库地址除了dladdr和解析/proc/<pid>/maps还可以有一些别的做法,比如可以用nm获取库文件的符号表进行对比,但如果库文件被strip处理过就不能这么用了,本文介绍的两种方案是泛用性最高的,感兴趣的朋友一起看看吧

+

目录


准备

一般来说动态库并不需要关心自己所在的文件系统上的路径,但业务有那么多总有一两个会有特殊需求。

现在给定一个动态库里的函数A,需求是要知道这个函数A是哪个动态库里的以及这个库的存放路径。

测试对象有两个,第一个是标准库的函数printf,另一个是我们自己写的动态链接库里的PrintRandomText函数。

自定义动态库的名字叫libmycustom1.so,代码和编译生成的库都存放在libmycustom1目录下。代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

// lib.h

#pragma once

#include <unistd.h>

#include <sys/random.h>

voidPrintRandomText(ssize_t length);

// lib.c

#include <stdio.h>

#include "lib.h"

voidPrintRandomText(ssize_t length)

{

    unsigned charbuff[64] = {0};

    length = (length + 1) / 2;

    if(length == 0) {

        return;

    }

    while(1) {

        ssize_t count = getrandom(buff, 64, 0);

        count = length > count ? count : length;

        for(ssize_t i = 0; i < count; ++i) {

            printf("%02X", buff[i]&0xff);

        }

        if(length <= count) {

            break;

        }

        length -= count;

    }

    printf("\n");

}

函数很简单,从Linux的/dev/urandom随机设备中读取指定大小的数据然后打印输出,编译使用如下命令:

1gcc -Wall -O2 -fPIC -shared lib.c -o libmycustom1.so

这样我们就得到了libmycustom1/libmycustom1.so。下面可以介绍如何在运行时获取动态库的路径了。

使用dladdr获取动态库路径

第一种方法是使用dladdr这个函数。dladdr是libdl.so中的一个函数,用来获取某个地址对应的动态库信息,而libdl是Linux上专门用来处理动态链接库的函数库。

dladdr获取的信息中恰巧有动态库的实际存放路径这一信息,我们可以加以利用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#define _GNU_SOURCE // 这行不能少

#include <dlfcn.h>  // for dladdr

#include <stdio.h>

#include "libmycustom1/lib.h"

intmain()

{

        Dl_info info1, info2;

        if(dladdr((void*)&printf, &info1) == 0) {

                fprintf(stderr, "cannot get printf's info\n");

                return1;

        }

        if(dladdr((void*)&PrintRandomText, &info2) == 0) {

                fprintf(stderr, "cannot get PrintRandomText's info\n");

                return1;

        }

        // 还需要检查dli_fname字段是否是NULL,这里就省略了

        printf("lib contains printf: %s\n", info1.dli_fname);

        printf("lib contains PrintRandomText: %s\n", info2.dli_fname);

}

dladdr在出错的时候会返回0,这时可以用dlerror来获取具体的报错,不过这里我为了简单起见就省略了。

编译运行需要下面的命令:

https://vk.com/topic-231169012_54248950

https://vk.com/topic-231169012_54248966

https://vk.com/topic-231169012_54249018

https://vk.com/topic-231169012_54249048

https://vk.com/topic-231169012_54249071

https://vk.com/topic-231169012_54249121

https://vk.com/topic-231169012_54249241

https://vk.com/topic-231169012_54249286

https://vk.com/topic-231169012_54249326

https://vk.com/topic-231169012_54249362

https://vk.com/topic-231169012_54249404

https://vk.com/topic-231169012_54249440

https://vk.com/topic-231169012_54249492

https://vk.com/topic-231169012_54249533

https://vk.com/topic-231169012_54249574

https://vk.com/topic-231169012_54249606

https://vk.com/topic-231169012_54249634

https://vk.com/topic-231169012_54249668

https://vk.com/topic-231169012_54249689

https://vk.com/topic-231169012_54249735

https://vk.com/topic-231169012_54249750

https://vk.com/topic-231169012_54249776

https://vk.com/topic-231169012_54249806

https://vk.com/topic-231169012_54249831

https://vk.com/topic-231169012_54249869

https://vk.com/topic-231169012_54249928

https://vk.com/topic-231169012_54249965

https://vk.com/topic-231169012_54250016

https://vk.com/topic-231169012_54250072

https://vk.com/topic-231169012_54250107

https://vk.com/topic-231169012_54250175

https://vk.com/topic-231169012_54250282

https://vk.com/topic-231169012_54250370

https://vk.com/topic-231169012_54250431

https://vk.com/topic-231169012_54250465

https://vk.com/topic-231169012_54250519

https://vk.com/topic-231169012_54250550

https://vk.com/topic-231169012_54250563

https://vk.com/topic-231169012_54250581

https://vk.com/topic-231169012_54250604

https://vk.com/topic-231169012_54250618

https://vk.com/topic-231169012_54250642

https://vk.com/topic-231169012_54250692

https://vk.com/topic-231169012_54250716

https://vk.com/topic-231169012_54250755

https://vk.com/topic-231169012_54250781

https://vk.com/topic-231169012_54250824

https://vk.com/topic-231169012_54250854

https://vk.com/topic-231169012_54250886

https://vk.com/topic-231169012_54250913

https://vk.com/topic-231169012_54250978

https://vk.com/topic-231169012_54251008

https://vk.com/topic-231169012_54251043

https://vk.com/topic-231169012_54251071

https://vk.com/topic-231169012_54251168

https://vk.com/topic-231169012_54251249

https://vk.com/topic-231169012_54251273

https://vk.com/topic-231169012_54251298

https://vk.com/topic-231169012_54251316

https://vk.com/topic-231169012_54251340

https://vk.com/topic-231169012_54251385

https://vk.com/topic-231169012_54251413

https://vk.com/topic-231169012_54251432

https://vk.com/topic-231169012_54251461

https://vk.com/topic-231169012_54251494

https://vk.com/topic-231169012_54251508

https://vk.com/topic-231169012_54251521

https://vk.com/topic-231169012_54251544

https://vk.com/topic-231169012_54251582

https://vk.com/topic-231169012_54251594

https://vk.com/topic-231169012_54251628

https://vk.com/topic-231169012_54251701

https://vk.com/topic-231169012_54251719

https://vk.com/topic-231169012_54251735

https://vk.com/topic-231169012_54251752

https://vk.com/topic-231169012_54251772

https://vk.com/topic-231169012_54251798

https://vk.com/topic-231169012_54251815

https://vk.com/topic-231169012_54251830

https://vk.com/topic-231169012_54251850

https://vk.com/topic-231169012_54251872

https://vk.com/topic-231169012_54251905

https://vk.com/topic-231169012_54251923

https://vk.com/topic-231169012_54251941

https://vk.com/topic-231169012_54251974

https://vk.com/topic-231169012_54252022

https://vk.com/topic-231169012_54252037

https://vk.com/topic-231169012_54252054

https://vk.com/topic-231169012_54252080

https://vk.com/topic-231169012_54252104

https://vk.com/topic-231169012_54252129

https://vk.com/topic-231169012_54252145

https://vk.com/topic-231169012_54252172

https://vk.com/topic-231169012_54252189

https://vk.com/topic-231169012_54252210

https://vk.com/topic-231169012_54252226

https://vk.com/topic-231169012_54252259

https://vk.com/topic-231169012_54252288

https://vk.com/topic-231169012_54252310

https://vk.com/topic-231169012_54252327

https://vk.com/topic-231169012_54252346

https://vk.com/topic-231169012_54252369

https://vk.com/topic-231169012_54252385

https://vk.com/topic-231169012_54252403

https://vk.com/topic-231169012_54252420

https://vk.com/topic-231169012_54252449

https://vk.com/topic-231169012_54252449

https://vk.com/topic-231169012_54252500

https://vk.com/topic-231169012_54125818

https://vk.com/topic-231169012_54125835

https://vk.com/topic-231169012_54125847

https://vk.com/topic-231169012_54125862

https://vk.com/topic-231169012_54125874

https://vk.com/topic-231169012_54125889

https://vk.com/topic-231169012_54125902

https://vk.com/topic-231169012_54125910

https://vk.com/topic-231169012_54125922

https://vk.com/topic-231169012_54125931

https://vk.com/topic-231169012_54125938

https://vk.com/topic-231169012_54125948

https://vk.com/topic-231169012_54125955

https://vk.com/topic-231169012_54125965

https://vk.com/topic-231169012_54125976

https://vk.com/topic-231169012_54125987

https://vk.com/topic-231169012_54125999

https://vk.com/topic-231169012_54126010

https://vk.com/topic-231169012_54126020

https://vk.com/topic-231169012_54126029

https://vk.com/topic-231169012_54126039

https://vk.com/topic-231169012_54126063

https://vk.com/topic-231169012_54126073

https://vk.com/topic-231169012_54126085

https://vk.com/topic-231169012_54126096

https://vk.com/topic-231169012_54126101

https://vk.com/topic-231169012_54126112

https://vk.com/topic-231169012_54126123

https://vk.com/topic-231169012_54126130

https://vk.com/topic-231169012_54126140

https://vk.com/topic-231169012_54126146

https://vk.com/topic-231169012_54126153

https://vk.com/topic-231169012_54126162

https://vk.com/topic-231169012_54126170

https://vk.com/topic-231169012_54126179

https://vk.com/topic-231169012_54126190

https://vk.com/topic-231169012_54126205

https://vk.com/topic-231169012_54126212

https://vk.com/topic-231169012_54126225

https://vk.com/topic-231169012_54126236

https://vk.com/topic-231169012_54126243

https://vk.com/topic-231169012_54126253

https://vk.com/topic-231169012_54128507

https://vk.com/topic-231169012_54128521

https://vk.com/topic-231169012_54128549

https://vk.com/topic-231169012_54128579

https://vk.com/topic-231169012_54128597

https://vk.com/topic-231169012_54128630

https://vk.com/topic-231169012_54128653

https://vk.com/topic-231169012_54128674

https://vk.com/topic-231169012_54128689

https://vk.com/topic-231169012_54128705

https://vk.com/topic-231169012_54128722

https://vk.com/topic-231169012_54128742

https://vk.com/topic-231169012_54128764

https://vk.com/topic-231169012_54128781

https://vk.com/topic-231169012_54128833

https://vk.com/topic-231169012_54128861

https://vk.com/topic-231169012_54128890

https://vk.com/topic-231169012_54128911

https://vk.com/topic-231169012_54128952

https://vk.com/topic-231169012_54128983

https://vk.com/topic-231169012_54129008

https://vk.com/topic-231169012_54129048

https://vk.com/topic-231169012_54129081

https://vk.com/topic-231169012_54129112

https://vk.com/topic-231169012_54129145

https://vk.com/topic-231169012_54129182

https://vk.com/topic-231169012_54129207

https://vk.com/topic-231169012_54129231

https://vk.com/topic-231169012_54129251

https://vk.com/topic-231169012_54129269

https://vk.com/topic-231169012_54129276

https://vk.com/topic-231169012_54129291

https://vk.com/topic-231169012_54129300

https://vk.com/topic-231169012_54129307

https://vk.com/topic-231169012_54129321

https://vk.com/topic-231169012_54129327

https://vk.com/topic-231169012_54129338

https://vk.com/topic-231169012_54129343

https://vk.com/topic-231169012_54129353

https://vk.com/topic-231169012_54129370

https://vk.com/topic-231169012_54129377

https://vk.com/topic-231169012_54129396

https://vk.com/topic-231169012_54129409

https://vk.com/topic-231169012_54129421

https://vk.com/topic-231169012_54129432

https://vk.com/topic-231169012_54129444

https://vk.com/topic-231169012_54129459

https://vk.com/topic-231169012_54129471

https://vk.com/topic-231169012_54129488

https://vk.com/topic-231169012_54129493

https://vk.com/topic-231169012_54129565

https://vk.com/topic-231169012_54129582

https://vk.com/topic-231169012_54129603

https://vk.com/topic-231169012_54129621

https://vk.com/topic-231169012_54129635

https://vk.com/topic-231169012_54129654

https://vk.com/topic-231169012_54129666

https://vk.com/topic-231169012_54129676

https://vk.com/topic-231169012_54129690

https://vk.com/topic-231169012_54129708

https://vk.com/topic-231169012_54129726

https://vk.com/topic-231169012_54129742

https://vk.com/topic-231169012_54129766

https://vk.com/topic-231169012_54129792

https://vk.com/topic-231169012_54129818

https://vk.com/topic-231169012_54129840

https://vk.com/topic-231169012_54129859

https://vk.com/topic-231169012_54129874

https://vk.com/topic-231169012_54129890

https://vk.com/topic-231169012_54129911

https://vk.com/topic-231169012_54129930

https://vk.com/topic-231169012_54129953

https://vk.com/topic-231169012_54129977

https://vk.com/topic-231169012_54129992

https://vk.com/topic-231169012_54130011

https://vk.com/club231169012?from=groups

https://vk.com/club230870556?from=groups

https://vk.com/topic-231169012_54130035

https://vk.com/topic-231169012_54130052

https://vk.com/topic-231169012_54130066

https://vk.com/topic-231169012_54130078

https://vk.com/topic-231169012_54130090

https://vk.com/topic-231169012_54130102

https://vk.com/topic-231169012_54130116

https://vk.com/topic-231169012_54130123

https://vk.com/topic-231169012_54130137

https://vk.com/topic-231169012_54130147

https://vk.com/topic-231169012_54130159

https://vk.com/topic-231169012_54130164

https://vk.com/topic-231169012_54130173

https://vk.com/topic-231169012_54130184

https://vk.com/topic-231169012_54130190

https://vk.com/topic-231169012_54130199

https://vk.com/topic-231169012_54130209

https://vk.com/topic-231169012_54130215

https://vk.com/topic-231169012_54130223

https://vk.com/topic-231169012_54130233

https://vk.com/topic-231169012_54130240

https://vk.com/topic-231169012_54130242

https://vk.com/topic-231169012_54130254

https://vk.com/topic-231169012_54130262

https://vk.com/topic-231169012_54130269

https://vk.com/topic-231169012_54130282

https://vk.com/topic-231169012_54130314

https://vk.com/topic-231169012_54130331

https://vk.com/topic-231169012_54130331

https://vk.com/topic-231169012_54130492

https://vk.com/topic-231169012_54130519

https://vk.com/topic-231169012_54130540

https://vk.com/topic-231169012_54128521

https://vk.com/topic-231169012_54130560

https://vk.com/topic-231169012_54130610

https://vk.com/topic-231169012_54130628

https://vk.com/topic-231169012_54130643

https://vk.com/topic-231169012_54130664

https://vk.com/topic-231169012_54130682

https://vk.com/topic-231169012_54130700

https://vk.com/topic-231169012_54130734

https://vk.com/topic-231169012_54130757

https://vk.com/topic-231169012_54130775

https://vk.com/topic-231169012_54130799

https://vk.com/topic-231169012_54130819

https://vk.com/topic-231169012_54130835

https://vk.com/topic-231169012_54130837

https://vk.com/topic-231169012_54130844

https://vk.com/topic-231169012_54130852

https://vk.com/topic-231169012_54130991

https://vk.com/topic-231169012_54130859

https://vk.com/topic-231169012_54130879

https://vk.com/topic-231169012_54130896

https://vk.com/topic-231169012_54130905

https://vk.com/topic-231169012_54130911

https://vk.com/topic-231169012_54130920

https://vk.com/topic-231169012_54130936

https://vk.com/topic-231169012_54130942

https://vk.com/topic-231169012_54130953

https://vk.com/topic-231169012_54130963

https://vk.com/topic-231169012_54130970

https://vk.com/topic-231169012_54131016

https://vk.com/topic-231171290_54432416

https://vk.com/topic-231171290_54432430

https://vk.com/topic-231171290_54432451

https://vk.com/topic-231171290_54432461

https://vk.com/topic-231171290_54440001

https://vk.com/topic-231171290_54440016

https://vk.com/topic-231171290_54440025

https://vk.com/topic-231171290_54440039

https://vk.com/topic-231171290_54440050

https://vk.com/topic-231171290_54440074

https://vk.com/topic-231171290_54440085

https://vk.com/topic-231171290_54440097

https://vk.com/topic-231171290_54440097

https://vk.com/topic-231171290_54440130

https://vk.com/topic-231171290_54440155

https://vk.com/topic-231171290_54440242

https://vk.com/topic-231171290_54440286

https://vk.com/topic-231171290_54440352

https://vk.com/topic-231171290_54440368

https://vk.com/topic-231171290_54440386

https://vk.com/topic-231171290_54440404

https://vk.com/topic-231171290_54440425

https://vk.com/topic-231171290_54440437

https://vk.com/topic-231171290_54440447

https://vk.com/topic-231171290_54440461

https://vk.com/topic-231171290_54440473

https://vk.com/topic-231171290_54440483

https://vk.com/topic-231171290_54440503

https://vk.com/topic-231171290_54440517

https://vk.com/topic-231171290_54440527

https://vk.com/topic-231171290_54440544

https://vk.com/topic-231171290_54440558

https://vk.com/topic-231171290_54440570

https://vk.com/topic-231171290_54440586

https://vk.com/topic-231171290_54440602

https://vk.com/topic-231171290_54440620

https://vk.com/topic-231171290_54440633

https://vk.com/topic-231171290_54440644

https://vk.com/topic-231171290_54440653

https://vk.com/topic-231171290_54440662

https://vk.com/topic-231171290_54440673

https://vk.com/topic-231171290_54440679

https://vk.com/topic-231171290_54440691

https://vk.com/topic-231171290_54440706

https://vk.com/topic-231171290_54440717

https://vk.com/topic-231171290_54440735

https://vk.com/topic-231171290_54440748

https://vk.com/topic-231171290_54440762

https://vk.com/topic-231171290_54440772

https://vk.com/topic-231171290_54440787

https://vk.com/topic-231171290_54440796

https://vk.com/topic-231171290_54440804

https://vk.com/topic-231171290_54440816

https://vk.com/topic-231171290_54440828

https://vk.com/topic-231171290_54440843

https://vk.com/topic-231171290_54440849

https://vk.com/topic-231171290_54440854

https://vk.com/topic-231171290_54440865

https://vk.com/topic-231171290_54440875

https://vk.com/topic-231171290_54440881

https://vk.com/topic-231171290_54440889

https://vk.com/topic-231171290_54440900

https://vk.com/topic-231171290_54440905

https://vk.com/topic-231171290_54440913

https://vk.com/topic-231171290_54440921

https://vk.com/topic-231171290_54440931

https://vk.com/topic-231171290_54440939

https://vk.com/topic-231171290_54440946

https://vk.com/topic-231171290_54440954

https://vk.com/topic-231171290_54440960

https://vk.com/topic-231171290_54440967

https://vk.com/topic-231171290_54440970

https://vk.com/topic-231171290_54440976

https://vk.com/topic-231171290_54440980

https://vk.com/topic-231171290_54440985

https://vk.com/topic-231171290_54440992

https://vk.com/topic-231171290_54440999

https://vk.com/topic-231171290_54441006

https://vk.com/topic-231171290_54441008

https://vk.com/topic-231171290_54441013

https://vk.com/topic-231171290_54441021

https://vk.com/topic-231171290_54441025

https://vk.com/topic-231171290_54441029

https://vk.com/topic-231171290_54441037

https://vk.com/topic-231171290_54441042

https://vk.com/topic-231171290_54441045

https://vk.com/topic-231171290_54441051

https://vk.com/topic-231171290_54441057

https://vk.com/topic-231171290_54441061

https://vk.com/topic-231171290_54441073

https://vk.com/topic-231171290_54441078

https://vk.com/topic-231171290_54441082

https://vk.com/topic-231171290_54441086

https://vk.com/topic-231171290_54441091

https://vk.com/topic-231171290_54441095

https://vk.com/topic-231171290_54441098

https://vk.com/topic-231171290_54441104

https://vk.com/topic-231171290_54441110

https://vk.com/topic-231171290_54441116

https://vk.com/topic-231171290_54441121

https://vk.com/topic-231171290_54441128

https://vk.com/topic-231171290_54441136

https://vk.com/topic-231171290_54441140

https://vk.com/topic-231171290_54441146

https://vk.com/topic-231171290_54441156

https://vk.com/topic-231171290_54441160

https://vk.com/topic-231171290_54441165

https://vk.com/topic-231171290_54441176

https://vk.com/topic-231171290_54441184

https://vk.com/topic-231171290_54441190

https://vk.com/topic-230870556_53696434

https://vk.com/topic-230870556_53696695

https://vk.com/topic-230870556_53696742

https://vk.com/topic-230870556_53696776

https://vk.com/topic-230870556_53696845

https://vk.com/topic-230870556_53696896

https://vk.com/topic-230870556_53696935

https://vk.com/topic-230870556_53696957

https://vk.com/topic-230870556_53696983

https://vk.com/topic-230870556_53697009

https://vk.com/topic-230870556_53697044

https://vk.com/topic-230870556_53697073

https://vk.com/topic-230870556_53697089

https://vk.com/topic-230870556_53697116

https://vk.com/topic-230870556_53697124

https://vk.com/topic-230870556_53697136

https://vk.com/topic-230870556_53697150

https://vk.com/topic-230870556_53697160

https://vk.com/topic-230870556_53697171

https://vk.com/topic-230870556_53697183

https://vk.com/topic-230870556_53697187

https://vk.com/topic-230870556_53697205

https://vk.com/topic-230870556_53697211

https://vk.com/topic-230870556_53697222

https://vk.com/topic-230870556_53701920

https://vk.com/topic-230870556_53701991

https://vk.com/topic-230870556_53702003

https://vk.com/topic-230870556_53702131

https://vk.com/topic-230870556_53702144

https://vk.com/topic-230870556_53702169

https://vk.com/topic-230870556_53702189

https://vk.com/topic-230870556_53702203

https://vk.com/topic-230870556_53702214

https://vk.com/topic-230870556_53702228

https://vk.com/topic-230870556_53702243

https://vk.com/topic-230870556_53702289

https://vk.com/topic-230870556_53702301

https://vk.com/topic-230870556_53702314

https://vk.com/topic-230870556_53702323

https://vk.com/topic-230870556_53702333

https://vk.com/topic-230870556_53702345

https://vk.com/topic-230870556_53702356

https://vk.com/topic-230870556_53702368

https://vk.com/topic-230870556_53702377

https://vk.com/topic-230870556_53702390

https://vk.com/topic-230870556_53702399

https://vk.com/topic-230870556_53702410

https://vk.com/topic-230870556_53702414

https://vk.com/topic-230870556_53702417

https://vk.com/topic-230870556_53702459

https://vk.com/topic-230870556_53702469

https://vk.com/topic-230870556_53702478

https://vk.com/topic-230870556_53702487

https://vk.com/topic-230870556_53702496

https://vk.com/topic-230870556_53702504

https://vk.com/topic-230870556_53702518

https://vk.com/topic-230870556_53702529

https://vk.com/topic-230870556_53702540

https://vk.com/topic-230870556_53702546

https://vk.com/topic-230870556_53702556

https://vk.com/topic-230870556_53702563

https://vk.com/topic-230870556_53702566

https://vk.com/topic-230870556_53702575

https://vk.com/topic-230870556_53702580

https://vk.com/topic-230870556_53702588

https://vk.com/topic-230870556_53702596

https://vk.com/topic-230870556_53702600

https://vk.com/topic-230870556_53702605

https://vk.com/topic-230870556_53702611

https://vk.com/topic-230870556_53702615

https://vk.com/topic-230870556_53702616

https://vk.com/topic-230870556_53702652

https://vk.com/topic-230870556_53702655

https://vk.com/topic-230870556_53702659

https://vk.com/topic-230870556_53702662

https://vk.com/topic-230870556_53702668

https://vk.com/topic-230870556_53702672

https://vk.com/topic-230870556_53702675

https://vk.com/topic-230870556_53702681

https://vk.com/topic-230870556_53702684

https://vk.com/topic-230870556_53702687

https://vk.com/topic-230870556_53702693

https://vk.com/topic-230870556_53702696

https://vk.com/topic-230870556_53702703

https://vk.com/topic-230870556_53702709

https://vk.com/topic-230870556_53702714

https://vk.com/topic-230870556_53702720

https://vk.com/topic-230870556_53702721

https://vk.com/topic-230870556_53702727

https://vk.com/topic-230870556_53702732

https://vk.com/topic-230870556_53702747

https://vk.com/topic-230870556_53702754

https://vk.com/topic-230870556_53702759

https://vk.com/topic-230870556_53702771

https://vk.com/topic-230870556_53702782

https://vk.com/topic-230870556_53702793

https://vk.com/topic-230870556_53702803

https://vk.com/topic-230870556_53702814

https://vk.com/topic-230870556_53702823

https://vk.com/topic-230870556_53702835

https://vk.com/topic-230870556_53702849

https://vk.com/topic-230870556_53702863

https://vk.com/topic-230870556_53702906

https://vk.com/topic-230870556_53702924

https://vk.com/topic-230870556_53702943

https://vk.com/topic-230870556_53702957

https://vk.com/topic-230870556_53702971

https://vk.com/topic-230870556_53702981

https://vk.com/topic-230870556_53702993

https://vk.com/topic-230870556_53703003

https://vk.com/topic-230870556_53703016

https://vk.com/topic-230870556_53703036

https://vk.com/topic-230870556_53703079

https://vk.com/topic-230870556_53703090

https://vk.com/topic-230870556_53703094

https://vk.com/topic-230870556_53703114

https://vk.com/topic-230870556_53703129

https://vk.com/topic-230870556_53703142

https://vk.com/topic-230870556_53703152

https://vk.com/topic-230870556_53703541

https://vk.com/topic-230870556_53703557

https://vk.com/topic-230870556_53703630

https://vk.com/topic-230870556_53742801

https://vk.com/topic-230870556_53742818

https://vk.com/topic-230870556_53742838

https://vk.com/topic-230870556_53742844

https://vk.com/topic-230870556_53742886

https://vk.com/topic-230870556_53742905

https://vk.com/topic-230870556_53742929

https://vk.com/topic-230870556_53742951

https://vk.com/topic-230870556_53742969

https://vk.com/topic-230870556_53742977

https://vk.com/topic-230870556_53742988

https://vk.com/topic-230870556_53743011

https://vk.com/topic-230870556_53743060

https://vk.com/topic-230870556_53743087

https://vk.com/topic-230870556_53743106

https://vk.com/topic-230870556_53743124

https://vk.com/topic-230870556_53743174

https://vk.com/topic-230870556_53743194

https://vk.com/topic-230870556_53743222

https://vk.com/topic-230870556_53743248

https://vk.com/topic-230870556_53743314

https://vk.com/topic-230870556_53743342

https://vk.com/topic-230870556_53743363

https://vk.com/topic-230870556_53743382

https://vk.com/topic-230870556_53743403

https://vk.com/topic-230870556_53743423

https://vk.com/topic-230870556_53743440

https://vk.com/topic-230870556_53743469

https://vk.com/topic-230870556_53743491

https://vk.com/topic-230870556_53743516

https://vk.com/topic-230870556_53743532

https://vk.com/topic-230870556_53743549

https://vk.com/topic-230870556_53743572

https://vk.com/topic-230870556_53743593

https://vk.com/topic-230870556_53743614

https://vk.com/topic-230870556_53743636

https://vk.com/topic-230870556_53743650

https://vk.com/topic-230870556_53743678

https://vk.com/topic-230870556_53743700

https://vk.com/topic-230870556_53743724

https://vk.com/topic-230870556_53743739

https://vk.com/topic-230870556_53743749

https://vk.com/topic-230870556_53743758

https://vk.com/topic-230870556_53743771

https://vk.com/topic-230870556_53743786

https://vk.com/topic-230870556_53743812

https://vk.com/topic-230870556_53743816

https://vk.com/topic-230870556_53743830

https://vk.com/topic-230870556_53743849

https://vk.com/topic-230870556_53744338

https://vk.com/topic-230870556_53744356

https://vk.com/topic-230870556_53744375

https://vk.com/topic-230870556_53744388

https://vk.com/topic-230870556_53744398

https://vk.com/topic-230870556_53744414

https://vk.com/topic-230870556_53744436

https://vk.com/topic-230870556_53744454

https://vk.com/topic-230870556_53744469

https://vk.com/topic-230870556_53744491

https://vk.com/topic-230870556_53744508

https://vk.com/topic-230870556_53744533

https://vk.com/topic-230870556_53744567

https://vk.com/topic-230870556_53744591

https://vk.com/topic-230870556_53744611

https://vk.com/topic-230870556_53744623

https://vk.com/topic-230870556_53744643

https://vk.com/topic-230870556_53744668

https://vk.com/topic-230870556_53744679

https://vk.com/topic-230870556_53744692

https://vk.com/topic-230870556_53744710

https://vk.com/topic-230870556_53744724

https://vk.com/topic-230870556_53744745

https://vk.com/topic-230870556_53744767

https://vk.com/topic-230870556_53744784

https://vk.com/topic-230870556_53744821

https://vk.com/topic-230870556_53744845

https://vk.com/topic-230870556_53778286

https://vk.com/topic-230870556_53778295

https://vk.com/topic-230870556_53778305

https://vk.com/topic-230870556_53778316

https://vk.com/topic-230870556_53778327

https://vk.com/topic-230870556_53778339

https://vk.com/topic-230870556_53778349

https://vk.com/topic-230870556_53778359

https://vk.com/topic-230870556_53778368

https://vk.com/topic-230870556_53778381

https://vk.com/topic-230870556_53778392

https://vk.com/topic-230870556_53778410

https://vk.com/topic-230870556_53778422

https://vk.com/topic-230870556_53778435

https://vk.com/topic-230870556_53778500

https://vk.com/topic-230870556_53778518

https://vk.com/topic-230870556_53778536

https://vk.com/topic-230870556_53778551

https://vk.com/topic-230870556_53778562

https://vk.com/topic-230870556_53778580

https://vk.com/topic-230870556_53778598

https://vk.com/topic-230870556_53778621

https://vk.com/topic-230870556_53778639

https://vk.com/topic-230870556_53778653

https://vk.com/topic-230870556_53778664

https://vk.com/topic-230870556_53778675

https://vk.com/topic-230870556_53778689

https://vk.com/topic-230870556_53778702

https://vk.com/topic-230870556_53778715

https://vk.com/topic-230870556_53778725

https://vk.com/topic-230870556_53778736

https://vk.com/topic-230870556_53778744

https://vk.com/topic-230870556_53778762

https://vk.com/topic-230870556_53778772

https://vk.com/topic-230870556_53778792

https://vk.com/topic-230870556_53778799

https://vk.com/topic-230870556_53778809

https://vk.com/topic-230870556_53778816

https://vk.com/topic-230870556_53778822

https://vk.com/topic-230870556_53778830

https://vk.com/topic-230870556_53778841

https://vk.com/topic-230870556_53778859

https://vk.com/topic-230870556_53778872

https://vk.com/topic-230870556_53778885

https://vk.com/topic-230870556_53778900

https://vk.com/topic-230870556_53778912

https://vk.com/topic-230870556_53778920

https://vk.com/topic-231169012_54248950

https://vk.com/topic-231169012_54248966

https://vk.com/topic-231169012_54249018

https://vk.com/topic-231169012_54249048

https://vk.com/topic-231169012_54249071

https://vk.com/topic-231169012_54249121

https://vk.com/topic-231169012_54249241

https://vk.com/topic-231169012_54249286

https://vk.com/topic-231169012_54249326

https://vk.com/topic-231169012_54249362

https://vk.com/topic-231169012_54249404

https://vk.com/topic-231169012_54249440

https://vk.com/topic-231169012_54249492

https://vk.com/topic-231169012_54249533

https://vk.com/topic-231169012_54249574

https://vk.com/topic-231169012_54249606

https://vk.com/topic-231169012_54249634

https://vk.com/topic-231169012_54249668

https://vk.com/topic-231169012_54249689

https://vk.com/topic-231169012_54249735

https://vk.com/topic-231169012_54249750

https://vk.com/topic-231169012_54249776

https://vk.com/topic-231169012_54249806

https://vk.com/topic-231169012_54249831

https://vk.com/topic-231169012_54249869

https://vk.com/topic-231169012_54249928

https://vk.com/topic-231169012_54249965

https://vk.com/topic-231169012_54250016

https://vk.com/topic-231169012_54250072

https://vk.com/topic-231169012_54250107

https://vk.com/topic-231169012_54250175

https://vk.com/topic-231169012_54250282

https://vk.com/topic-231169012_54250370

https://vk.com/topic-231169012_54250431

https://vk.com/topic-231169012_54250465

https://vk.com/topic-231169012_54250519

https://vk.com/topic-231169012_54250550

https://vk.com/topic-231169012_54250563

https://vk.com/topic-231169012_54250581

https://vk.com/topic-231169012_54250604

https://vk.com/topic-231169012_54250618

https://vk.com/topic-231169012_54250642

https://vk.com/topic-231169012_54250692

https://vk.com/topic-231169012_54250716

https://vk.com/topic-231169012_54250755

https://vk.com/topic-231169012_54250781

https://vk.com/topic-231169012_54250824

https://vk.com/topic-231169012_54250854

https://vk.com/topic-231169012_54250886

https://vk.com/topic-231169012_54250913

https://vk.com/topic-231169012_54250978

https://vk.com/topic-231169012_54251008

https://vk.com/topic-231169012_54251043

https://vk.com/topic-231169012_54251071

https://vk.com/topic-231169012_54251168

https://vk.com/topic-231169012_54251249

https://vk.com/topic-231169012_54251273

https://vk.com/topic-231169012_54251298

https://vk.com/topic-231169012_54251316

https://vk.com/topic-231169012_54251340

https://vk.com/topic-231169012_54251385

https://vk.com/topic-231169012_54251413

https://vk.com/topic-231169012_54251432

https://vk.com/topic-231169012_54251461

https://vk.com/topic-231169012_54251494

https://vk.com/topic-231169012_54251508

https://vk.com/topic-231169012_54251521

https://vk.com/topic-231169012_54251544

https://vk.com/topic-231169012_54251582

https://vk.com/topic-231169012_54251594

https://vk.com/topic-231169012_54251628

https://vk.com/topic-231169012_54251701

https://vk.com/topic-231169012_54251719

https://vk.com/topic-231169012_54251735

https://vk.com/topic-231169012_54251752

https://vk.com/topic-231169012_54251772

https://vk.com/topic-231169012_54251798

https://vk.com/topic-231169012_54251815

https://vk.com/topic-231169012_54251830

https://vk.com/topic-231169012_54251850

https://vk.com/topic-231169012_54251872

https://vk.com/topic-231169012_54251905

https://vk.com/topic-231169012_54251923

https://vk.com/topic-231169012_54251941

https://vk.com/topic-231169012_54251974

https://vk.com/topic-231169012_54252022

https://vk.com/topic-231169012_54252037

https://vk.com/topic-231169012_54252054

https://vk.com/topic-231169012_54252080

https://vk.com/topic-231169012_54252104

https://vk.com/topic-231169012_54252129

https://vk.com/topic-231169012_54252145

https://vk.com/topic-231169012_54252172

https://vk.com/topic-231169012_54252189

https://vk.com/topic-231169012_54252210

https://vk.com/topic-231169012_54252226

https://vk.com/topic-231169012_54252259

https://vk.com/topic-231169012_54252288

https://vk.com/topic-231169012_54252310

https://vk.com/topic-231169012_54252327

https://vk.com/topic-231169012_54252346

https://vk.com/topic-231169012_54252369

https://vk.com/topic-231169012_54252385

https://vk.com/topic-231169012_54252403

https://vk.com/topic-231169012_54252420

https://vk.com/topic-231169012_54252449

https://vk.com/topic-231169012_54252449

https://vk.com/topic-231169012_54252500

                  [vdso]

可以看到libc和我们自己的库都被记载进文件里了。每行内容是空格分开的,对于匿名映射不会有最后的路径。第一列的就是内存地址,以“-”连字符分隔,第一部分是内存映射区域开始地址,第二部分是结束地址。

这和获取函数对应的动态库有什么关系呢?关系肯定是有的,在Linux上动态库里的“函数”其实就是一段编译好的代码,加载进内存后它也会占用一段内存空间,调用动态库函数的时候实际上是下面这样的流程:

根据函数名称跳转到对应的符号表项目上

检查函数是否被加载,有加载就跳过下面步骤直接到4

未加载时loader会去动态库文件里读取对应函数的代码,存入内存,然后把项目内容用代码在内存里的起始地址覆盖

程序跳转到函数代码所在的内存地址上,开始一条条加载执行这些代码

加载进内存的代码权限是r-xp,代表内存里的内容可以被执行。

现在出于安全考虑有些程序会使用编译选项把这些工作提前到程序加载运行时就完成,但大致上是一样的。被加载的函数的内存会被记载进maps文件,所以我们只要读取maps文件然后对比内存地址范围,就能知道函数对应的库和路径了。

因为我们只看函数地址,因此不用查的太细,只要地址在范围内就可以,无需查看权限。知道原理后就可以写个脚本去解析了:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

local function searchAddr(pid, addr)

    local file = io.open("/proc/".. pid .. "/maps", "r")

    ifnot file then

        print("进程不存在: ".. pid)

        return

    end

    forline in file:lines() do

        local parts = {}

        forword in line:gmatch("%S+") do

            table.insert(parts, word)

        end

        if#parts > 5 then

            local addrParts = {}

            foraddr in parts[1]:gmatch("[^%-]+") do

                table.insert(addrParts, addr)

            end

            if#addrParts == 2 then

                local startAddr = tonumber(addrParts[1], 16) or 0

                local endAddr = tonumber(addrParts[2], 16) or 0

                ifstartAddr <= addr and addr < endAddr then

                        print(parts[#parts])

                        break;

                end

            end

        end

    end

    file:close()

end

if#arg ~= 2 then

        print("no enough args")

        os.exit(1)

end

local addr = tonumber(arg[2]) or 0

ifaddr == 0 then

        print("addr can not be 0")

        os.exit(1)

end

searchAddr(arg[1], addr)

c语言处理字符串太折磨了,所以我用lua偷个懒,代码就不解释了因为很简单,你可以让ai代劳解读一下。

进程退出后proc文件也就没了,所以测试代码也得改一下不要让进程那么快退出:

1

2

3

4

5

6

7

8

9

#include <stdio.h>

#include "libmycustom1/lib.h"

intmain()

{

    printf("pid %d\n", getpid());

    printf("printf address: %p\n", (void*)&printf);

    printf("PrintRandomText address: %p\n", (void*)&PrintRandomText);

    pause(); // 阻塞进程直到收到信号

}

运行结果:

可以看到我们顺利找到了函数对应的库以及库的存放路径。

使用proc maps的优点是不需要额外的依赖,而且得到的路径都是绝对路径。缺点则是需要函数指针转换成地址值,以及proc是Linux等少数系统独有的,不通用,而且读取maps文件需要有专门的权限,这个权限默认打开但是可以选择关闭。

总结

运行时获取动态库地址除了dladdr和解析/proc/<pid>/maps还可以有一些别的做法。比如可以用nm获取库文件的符号表进行对比,但如果库文件被strip处理过就不能这么用了。本文介绍的两种方案是泛用性最高的。

另外也别太依赖这些结果,因为隐藏或者篡改这些信息太过简单。如果你的想要动态库的路径,应该使用构建系统注入信息或者干脆做出输入选项,而不是依靠这些可靠性和可移植性都欠佳的方案。

到此这篇关于Linux c 运行时获取动态库所在路径 的文章就介绍到这了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容