Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 代码的链接时间运行?(具体而言,Valgrind在linktime提出的问题)_C_Linux_Opencl_Valgrind_Shared Libraries - Fatal编程技术网

C 代码的链接时间运行?(具体而言,Valgrind在linktime提出的问题)

C 代码的链接时间运行?(具体而言,Valgrind在linktime提出的问题),c,linux,opencl,valgrind,shared-libraries,C,Linux,Opencl,Valgrind,Shared Libraries,我怀疑这是我理解共享对象的链接在Linux上是如何发生的一个问题 将Valgrind与OpenCL结合使用(我从其他文章中了解到,这本身就有问题),我遇到了来自共享对象一部分但从未实际运行的模块的错误 具体来说,我有一个OpenCL助手模块,它有一系列用于执行OpenCL操作的函数。我已经从执行代码中删除了对该模块中函数的所有引用。因此,我天真地认为,这个模块不会给Valgrind带来任何问题 然而,我看到了通过\u dl\u init.c提出的问题(其中很多问题,显示了OpenCL在Valgr

我怀疑这是我理解共享对象的链接在Linux上是如何发生的一个问题

将Valgrind与OpenCL结合使用(我从其他文章中了解到,这本身就有问题),我遇到了来自共享对象一部分但从未实际运行的模块的错误

具体来说,我有一个OpenCL助手模块,它有一系列用于执行OpenCL操作的函数。我已经从执行代码中删除了对该模块中函数的所有引用。因此,我天真地认为,这个模块不会给Valgrind带来任何问题

然而,我看到了通过
\u dl\u init.c
提出的问题(其中很多问题,显示了OpenCL在Valgrind中是如何被破坏的)。这对我来说意味着OpenCL运行时中的代码是在链接时执行的

有人能澄清(或给我指出合适的澄清材料)链接器过程中如何涉及
\u dl\u init.c

.so
文件执行一些初始化代码,这是普遍的事实,还是库选项

这是库编写者很容易访问的东西,还是涉及到恶意黑客?

共享对象(
。因此
文件)被允许在库加载后立即执行代码,而不管库中的任何代码如何使用

这是用来执行C++对象的静态初始化的。

如果您不想让valgrind在背后抱怨库中正在做的事情,那么您可以运行valgrind,以便它通过传入
--gen suppressions=all
生成可以用作抑制文件的输出。在对库运行时,您可以在自己的抑制文件中使用抑制输出,它应该可以掩盖这些问题

出现以下情况时:

    如果使用C++代码并具有全局范围的对象,则在加载库时调用它们的构造函数
  • 如果将特定于gcc的属性((构造函数))添加到函数定义中,则在加载库时会调用它
e、 g.(C++)在全局范围内:

#include <iostream>

class demo {
    demo() { std::cout << "Hello World" << std::endl; }
    ~demo() {}
};

demo ademo;
#包括
课堂演示{

demo(){std::cout共享库可以具有依赖项(运行时调用的其他库),这似乎是您所要求的。请尝试在/lib.nm[filename.so]中的某些共享库上使用ldd命令将显示库中也有外部符号。@jimmcnamara当然,但我通常不希望调用依赖项中的代码,除非调用初始库。我遇到的问题是,代码在共享库中执行,除了链接到它之外,我的代码没有任何触发器(导致Valgrind出现问题)我不明白这段代码是如何被调用的。它似乎是通过
\u dl_init.c
ld-2.17中调用的。因此
,因此假设它发生在链接时。我的问题是,这是通过什么过程发生的?执行-这就是我所说的。一个模块被实例化并运行,甚至可能在另一个线程中运行r进程。我想你和我谈论的都是过去式的。可能是某种隐含的假设。假设调用了libA。它对libB有依赖关系,libB也会被调用。现在,libB需要调用_dl_init.c,所以它会运行libA.或libC.中的代码。在进程上运行fuser或lsof来查看什么是really open。一旦库打开,库中的任何入口点都是公平的。您不必在代码中显式引用该入口点,它才能运行。OpenCL有点混乱,因此这意味着循环引用也不是不可能的。所以,我的问题是,为什么要调用libA?我没有定义int的入口o libA,但在某种意义上它仍在执行中(是的,它调用的其他库正在中断)。你知道
\u dl\u init.c
吗,因此可以启发我吗?:)好的,这就是我想要的。你有关于这种情况发生的方式和时间的参考资料吗?是在ELF对象的某个特定部分执行的代码吗?很容易将其添加到我自己的假设库中吗(出于兴趣)?我已经压制了Valgrind的警告,但我想弄清我的误解。我已经添加了一些例子,还提到了.init/.fini ELF部分谢谢你,@Petesh-你的第一段是我试图解释的。我想很糟糕+1@jimmcnamara我很抱歉没有从你那里得到!
#include <stdio.h>
static void __attribute__((constructor)) my_init() {
    printf("Hello World\n");
}