相关疑难解决方法(0)

Clang/GCC真的支持延迟加载功能吗?

如果您真的经历过与上述标题相关的事情,您是否介意留下您对此的评论?我试图让一个共享对象在Ubuntu上延迟加载Clang和GCC(我实际上不介意使用哪个编译器),但它们看起来并不支持任何延迟加载功能(我期望延迟加载功能)在一个父对象中放置一个存根,该对象试图在需要功能的时刻根据需要加载另一个对象,但实际上并没有这样做.以下命令显示我试图使libbar.so延迟加载到libfoo.so:

clang bar.c -fPIC -shared -o libbar.so
clang foo.c -Wl,-zlazy,lL'/path/to/where/lib/is',-lbar -o foo
Run Code Online (Sandbox Code Playgroud)

如果libbar.so不存在,您将看到libfoo.so在进入条目之前引发异常.无论如何,我不介意上面的命令中是否有任何拼写错误,但是想知道Clang/GCC是否真的支持延迟加载功能.

但就个人而言,如果Clang/GCC不支持任何延迟加载功能,我无法相信Linux程序开发人员是否需要调用dlopen()或dlsym()来使共享对象延迟加载.如果对象是用C语言编写的,那可能没问题,但如果它是用C++编写的,情况必须完全复杂:(

我相信在编译器或链接器的帮助下实现的解决方案是最好的,因为我已经成功地使用Windows和Mac OS.所以我觉得,即使在Clang/GCC上,公民也希望梦想拥有延迟加载功能,这将是一种自然的反应.如果你对我的感受有任何评论,我也会很感激.

PS.我知道Solaris支持延迟加载功能,但这不适合我,因为我不会在其上开发任何东西.

无论如何,非常感谢你提前.

c++ linux gcc clang

5
推荐指数
2
解决办法
2783
查看次数

为什么动态链接时g ++会检测到未定义的引用

我可能对动态链接的工作方式感到误解,因为我无法弄清楚。据我了解,动态链接库时,其符号在运行时解析。从这个答案:

当您动态链接时,可执行文件中将包含指向要链接的文件的指针(例如,文件的文件名),并且链接时不包含该文件的内容。只有当您以后运行该可执行文件时,这些动态链接的文件才被购买,并且它们仅被购买到该可执行文件的内存中副本中,而不是磁盘中的一个副本中。

[...]

在动态情况下,主程序与C运行时导入库(声明动态库中的内容但未实际定义的内容)链接在一起。即使实际的代码丢失,这也允许链接器链接。

然后,在运行时,操作系统加载程序将主程序与C运行时DLL(动态链接库或共享库或其他命名法)进行后期链接。

我对为什么g++动态链接到共享对象时似乎期望共享对象在那里感到困惑。当然,我希望库的名称是必需的,以便可以在运行时加载它,但是为什么.so在此阶段它是必需的?此外,g++在链接库时,抱怨未定义的引用。

我的问题是:

  1. g++如果库的加载仅在运行时发生,为什么在动态链接共享对象时似乎需要共享对象?我知道-l指定共享对象的名称可能需要该标志,以便可以在运行时加载它,但是我看不出必须提供.so指向链接时间(-L)或.so自身的路径。
  2. 为什么g++在动态链接时尝试解析符号?没有什么可以阻止我.so在链接时完成操作,而是.so在运行时提供一个不同的(不完整的)消息,这会导致程序在尝试使用未定义的符号时崩溃。

我举了一个可重现的例子:

目录结构:

.
??? main.cpp
??? test
    ??? usertest.cpp
    ??? usertest.h
Run Code Online (Sandbox Code Playgroud)

文件内容:

测试/用户测试

#ifndef USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346
#define USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346

namespace usertest
{
    void helloWorld();

    // This method is not defined anywhere
    void byeWorld();
};

#endif /* USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346 */
Run Code Online (Sandbox Code Playgroud)

测试/用户测试.cpp

#include "usertest.h"
#include <iostream>

void usertest::helloWorld()
{
    std::cout << "Hello, world\n"; …
Run Code Online (Sandbox Code Playgroud)

c++ g++ dynamic-linking

3
推荐指数
1
解决办法
335
查看次数

标签 统计

c++ ×2

clang ×1

dynamic-linking ×1

g++ ×1

gcc ×1

linux ×1