小编Doo*_*fah的帖子

Clang的UBSan和功能指针:这是非法的吗?

我试图通过函数指针表调用一些C++函数,该表从共享对象导出为C符号.该代码实际上正在工作,但Clang的未定义行为清理程序(= UBSan)看到我所做的调用是非法的,如下所示:

==11410==WARNING: Trying to symbolize code, but external symbolizer is not initialized!
path/to/HelloWorld.cpp:25:13: runtime error: call to function (unknown) through pointer to incorrect function type 'foo::CBar &(*)()'
(./libFoo.so+0x20af0): note: (unknown) defined here
Run Code Online (Sandbox Code Playgroud)

由于Clang的未定义行为清理程序,间接调用函数通过函数指针返回C++标准类对象的引用是合法的,但对于用户定义的类是非法的.有人可以告诉我它有什么问题吗?

我一直在尝试使用Clang-llvm 3.4-1ubuntu3CMake 2.8.12.2Ubuntu 14.04上构建项目.要重现此现象,请将以下5个文件放在同一目录中并调用build.sh.它将创建一个makefile并构建项目,并运行可执行文件.

foo.h中

#ifndef FOO_H
#define FOO_H

#include <string>

//
#define EXPORT __attribute__ ((visibility ("default")))

namespace foo {
    class CBar
    {
        // empty
    };

    class CFoo
    {
    public:
        static CBar& GetUdClass();
        static std::string& GetStdString();
    }; …
Run Code Online (Sandbox Code Playgroud)

c++ linux shared-libraries clang ubsan

10
推荐指数
1
解决办法
825
查看次数

如何在Linux上加载共享库延迟

我一直在寻找一种方法来建立一个共享库(让我们命名库libbar.so)延迟加载到Linux上,它应该只在一个链接器的帮助下实现,而不是修改用C++编写的源代码的任何东西; 我的意思是我不想要调用dlopen(),也没有dlsym()在母库的源代码(我们将其命名为libfoo.so)调用的函数libbar.so,因为它们使源代码混乱和维护过程困难.(简而言之,/DELAYLOAD即使在Linux 上,我也期望以类似的方式使用Visual Studio的选项)

无论如何,到目前为止,我已经在互联网上找到了与我的问题相关的一些不确定的信息片段,所以很高兴能得到你们所有人的答案,以便让信息清晰.

  1. GNU ld是否支持Linux上的任何延迟加载机制?
  2. 如果没有,Clang怎么样?
  3. dlopen()家庭,使装在Linux上的共享库延迟的唯一途径?

我测试了将-zlazy标志传递给GCC(g ++)并带有一个到库的路径,它似乎接受了标志,但是行为看起来没有libbar.so加载延迟(没有libbar.so,我期待在第一次调用时有异常libbar.so,但是在进入之前实际提出的例外libfoo.so).另一方面,Clang(clang++)发出警告,忽略了选项标志.

最好的祝福,

c++ linux gcc shared-libraries clang

6
推荐指数
2
解决办法
4576
查看次数

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
查看次数

标签 统计

c++ ×3

clang ×3

linux ×3

gcc ×2

shared-libraries ×2

ubsan ×1