Linux - 为啥我的可执行文件将 libpthread 作为共享库?

Posted

技术标签:

【中文标题】Linux - 为啥我的可执行文件将 libpthread 作为共享库?【英文标题】:Linux - Why does my executable have libpthread as a shared library?Linux - 为什么我的可执行文件将 libpthread 作为共享库? 【发布时间】:2016-08-04 01:54:10 【问题描述】:

所以基本上我想知道为什么我的可执行文件将 libpthread 作为共享库,而我的代码却没有使用任何线程函数。它也不包含在 makefile 中。是不是因为GCC默认编译时使用“--enable-threads=posix”?

如果是这样,有没有办法从我的可执行文件中删除它?如果不是,那是什么问题?

ldd

    linux-vdso.so.1 =>  (0x0000656150c5a000)
    librt.so.1 => /lib64/librt.so.1 (0x0000656150a4c000)
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000656150746000)
    libm.so.6 => /lib64/libm.so.6 (0x00006561504c1000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00006561502ab000)
    libc.so.6 => /lib64/libc.so.6 (0x000065614ff17000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x000065614fcf9000)
    /lib64/ld-linux-x86-64.so.2 (0x0000656150c5b000)

生成文件

CC = gcc
OFLAGS = -O3

C++ = g++ -g
LFLAGS = -lrt

# API Exclusions
DFLAGS = -DNO_ZLIB -DNO_LOCALIZATION -DNO_INTERFACE

CFLAGS = $(OFLAGS) $(DFLAGS) -I. -I../rgapi/include/core/ -I../rgapi/include/public/

OBJS = ( ... list of .o files ... )
PROGS = ./rgs

all: $(OBJS) $(PROGS)

./rgs: $(OBJS)
    $(C++) -o ./rgs $(OBJS) $(LFLAGS)

clean:
    rm -f $(OBJS) $(PROGS)

$(OBJS): %.o: %.cpp
    $(C++) -o $@ $(CFLAGS) -c $<

./rgs: $(OBJS)

【问题讨论】:

【参考方案1】:

你正在链接librt.so:

LFLAGS = -lrt

这是间接依赖。

$ ldd /usr/lib64/librt.so
    linux-vdso.so.1 (0x00007ffcc33d2000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2480a0b000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f2480649000)
    /lib64/ld-linux-x86-64.so.2 (0x0000562f4cffb000)

librt.so-lpthread 链接。如果您与任何共享库链接,您将继承与共享库链接的所有包袱。

您不能“将其从可执行文件中删除”。这样做的唯一方法是不链接-lrt

【讨论】:

哦,哇,说真的……好吧,我没有检查 librt,因为我认为它不会将 libpthread 作为依赖项。好的......我只链接 -lrt 因为 exe 测量主循环中间隔更新的时间。有没有可以测量间隔的替代方法?通常在 50ms 范围内进行更新循环而不必使用clock_gettime,从而链接librt。我现在正在做的事情。 gettimeofday() 应该足以满足此目的。 我想知道你是否也知道我是否应该担心时间更新 - 我一直使用 CLOCK_MONOTONIC 因为它用于游戏服务器,我将时间用于更新间隔和决定连接何时超时。即使是几秒钟的跳跃也可能非常糟糕。我应该禁用 NTP 服务还是不必担心这个? 是的,gettimeofday() 将报告系统时钟的变化。

以上是关于Linux - 为啥我的可执行文件将 libpthread 作为共享库?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Git Bash 不能运行我的可执行文件?

为啥 Git Bash 不能运行我的可执行文件?

为啥我的可执行文件中的入口点地址是 0x8048330? (0x330 是 .text 部分的偏移量)

为啥 AssocQueryString 找不到与图像扩展关联的可执行文件?

由于调试符号,巨大的可执行文件,为啥?

未找到 GraphViz 的可执行文件 - 为啥通过 pip 安装 graphViz 后没有安装可执行文件?