标签: dynamic-linking

GCC动态库构建问题

我是linux的新手,在使用动态库进行编译时,我收到了segmentationfault错误.

我有两个文件

ctest1.c

void ctest1(int *i)
{ 
   *i =10;
}
Run Code Online (Sandbox Code Playgroud)

ctest2.c

void ctest2(int *i)
{ 
   *i =20;
}
Run Code Online (Sandbox Code Playgroud)

我已使用以下命令将这两个文件编译到名为libtest.so的共享库中

  gcc -shared -W1,-soname,libtest.so.1 -o libtest.so.1.0.1 ctest1.o ctest2.o -lc
Run Code Online (Sandbox Code Playgroud)

我已经编写了另一个程序prog.c,它使用了这个库导出的函数

prog.c中

#include <stdio.h>

void (*ctest1)(int*);
void (ctest2)(int*);


int main()
{
  int a;

  ctest1(&a);

  printf("%d",a);

  return 0;

}
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令构建可执行文件时

gcc -Wall prog.c -L.-o prog

但是当我运行生成的可执行文件时,我得到了SegmentationFault错误.

当我用ldd检查prog的标题时,它显示出来

linux-vdso.so.1 =>(0x00007f99dff000)libc.so.6 => /lib64/libc.so.6(0x0007feeaa8c1000)/lib64/ld-linux-x86-64.so.2(0x00007feeaac1c000)

有人可以说出问题所在

gcc dynamic-linking

2
推荐指数
1
解决办法
981
查看次数

为什么缺少共享的图书馆会致命?

g++ -o Test Test.cpp -lTest
/usr/bin/ld: cannot find -lTest
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

如果在运行时按需加载共享/动态库中的符号,为什么在编译时缺少库会导致致命错误?

compiler-construction linker gcc dynamic-linking

2
推荐指数
1
解决办法
355
查看次数

命名静态对象的名称

我在C++中看到了关于动态链接的这篇文章.

我们可以创建一个C++工厂,它将返回我们感兴趣的类的对象.此外,我们应该在工厂的文件范围内创建一个静态对象,以便可以使用它来定位它dlsym().(文章建议静态对象不会受到名称损坏.)

为什么静态对象没有名称损坏?

c++ static-members name-mangling dynamic-linking

2
推荐指数
1
解决办法
149
查看次数

使用LD_PRELOAD重载调用共享库的C函数

我正在按照这个答案来覆盖对C库的C函数的调用.

我想我做的一切都正确,但它不起作用:

我想覆盖"DibOpen"功能.这是我在运行应用程序时传递给LD_PRELOAD环境变量的库代码:

DIBSTATUS DibOpen(void **ctx, enum Board b)
{
    printf("look at me, I wrapped\n");

    static DIBSTATUS (*func)(void **, enum Board) = NULL;
    if(!func)
        func = dlsym(RTLD_NEXT, "DibOpen");
    printf("Overridden!\n");
    return func(pContextAddr, BoardType, BoardHdl);
}
Run Code Online (Sandbox Code Playgroud)

nm lib.so | grep DibOpen节目的输出

000000000001d711 T DibOpen
Run Code Online (Sandbox Code Playgroud)

当我像这样运行我的程序时

LD_PRELOAD=libPreload.so ./program
Run Code Online (Sandbox Code Playgroud)

program用-ldl 链接我,但ldd program没有显示libdl.so的链接

它停止了

 symbol lookup error: libPreload.so: undefined symbol: dlsym
Run Code Online (Sandbox Code Playgroud)

.我该怎么做才能进一步调试?我的错误在哪里?

c gcc dynamic-linking ld

2
推荐指数
1
解决办法
2296
查看次数

不可能在动态链接的C++库中使用虚函数?

例如,此代码段错误(请参阅main.cpp中的注释).

hello.h

struct A { virtual ~A() {} };
Run Code Online (Sandbox Code Playgroud)

HELLO.CPP

#include "hello.h"

extern "C" {
    void hello(A*& a) {
        a = new A;
    }
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include <cassert>
#include <dlfcn.h>

#include "hello.h"

int main() {

    void* handle = dlopen("./hello.so", RTLD_LAZY);
    assert(handle);

    typedef void (*hello_t)(A*& a);
    hello_t hello = (hello_t) dlsym(handle, "hello");
    assert(hello);

    A* a = nullptr;
    hello(a);
    dlclose(handle);

    delete a; // -> segfault
}
Run Code Online (Sandbox Code Playgroud)

g++ -Wall -std=c++11 -g main.cpp -ldl -o main
g++ -Wall -std=c++11 -g -shared -fpic hello.cpp …
Run Code Online (Sandbox Code Playgroud)

c++ virtual-functions dynamic-linking

2
推荐指数
3
解决办法
1363
查看次数

在Linux上使用共享库来减少内存负载

在低内存Linux系统上,我有一个由单个可执行文件和许多共享库组成的项目.这些库不与其他可执行文件共享,并且只有一个可执行文件实例随时运行.有人告诉我,这个设置允许共享库在不处于活动状态时从内存中卸载.它是否正确?

在我看来,简单地将整个项目构建为单个静态二进制文件(当然不包括系统共享库)更有意义,因为每个函数只有一个副本在内存中是活动的.

这两种方法有区别吗?

c linux memory linker dynamic-linking

2
推荐指数
1
解决办法
83
查看次数

通过覆盖C标准库调用来测量堆使用情况

参考以下代码

#include <cassert>
#include <vector>
#include <dlfcn.h>
#include <limits>
#include <map>
#include <algorithm>
#include <iostream>
using std::cout;
using std::endl;
using std::vector;

/*
 * Overload the malloc call
 */
int max_heap_usage = 0;
std::map<uintptr_t, int>& heap_memory_map;
void track_max_usage(std::map<uintptr_t, int> heap_memory_map, 
        int& max_heap_usage);

void* malloc(size_t size) {

    // get the original malloc function call
    static auto original_malloc = (decltype(&malloc)) dlsym(RTLD_NEXT, "malloc");

    // Get the pointer from malloc
    void* pointer = original_malloc(size);
    uintptr_t pointer_handle = reinterpret_cast<uintptr_t>(pointer);

    // assert that the pointer does not …
Run Code Online (Sandbox Code Playgroud)

c++ malloc dynamic-linking c++11 c++14

2
推荐指数
1
解决办法
260
查看次数

静态链接英特尔tbb的问题

我最近读了这个问题如何静态链接到TBB?我仍然不明白使用tbb作为静态链接库的问题(如果你这样做,可以使用它们的makefile make extra_inc=big_iron.inc tbb)

答案似乎是说问题在于单个程序中可能存在多个单例,单个子的所有(大多数?)实现都不会让这种情况发生.我不明白这背后的原因.

问题在于,当您进行fork()另一个处理时,单例会在两个单独的进程中成为两个独立的单例吗?那是"程序"的意思吗?如果就是这样,为什么他们不能mmap()共享内存并将其用作通信媒介?

也不动态链接只意味着库本身在内存中共享,即代码段?

谢谢!

c++ tbb dynamic-linking

2
推荐指数
1
解决办法
318
查看次数

Python如何调用C?

Python如何调用C库?例如,Tensorflow我认为主要是用C语言编写的,但可以从Python中使用.我正在考虑在我自己的(解释的)编程语言中实现类似的东西(用Go编写,但我认为它将是一个类似的过程).

Python程序调用C函数时会发生什么?我在想RPC或DLL,但它们似乎都不太可能.

c python dynamic-linking

2
推荐指数
1
解决办法
2036
查看次数

我可以强制动态库链接到特定的动态库依赖项吗?

我正在构建一个动态库libfoo.so,该库取决于libcrypto.so

在我的自动工具Makefile.am文件中,我有这样一行:

libfoo_la_LIBADD += -L${OPENSSL_DIR}/lib -lcrypto
Run Code Online (Sandbox Code Playgroud)

其中$OPENSSL_DIR缺省为/usr,但可以通过使被覆盖--with-openssl-dir=/whatever

我如何确保(仅)libfoo.so使用一个可执行文件而无需构建或运行该可执行文件的人来使用或摆弄?${OPENSSL_DIR}/lib/libcrypto.sorpathLD_LIBRARY_PATH

就目前情况而言,我可以构建libfoo并通过--with-openssl-dir=/usr/local/openssl-special,并且构建良好。但是,当我运行ldd libfoo.so,它只是指向libcrypto.so/usr/lib

我能想到的唯一解决方案是静态链接libcrypto.alibfoo.so。还有其他可能的方法吗?

c autotools shared-libraries dynamic-linking static-linking

2
推荐指数
1
解决办法
61
查看次数