标签: dynamic-linking

Linux共享库加载并与其他进程共享代码

假设我有一个共享库a.so,它是由我的可执行文件第一次加载的。我的理解是,共享库文本部分被映射到VMA的中间。我有两个问题;

(1) ld.so是否会将这个共享内存文本节页面加载到物理内存,然后映射到该进程的VMA?

(2) 假设启动了使用相同共享库的第二个可执行文件a.so。ld.so会识别出这个共享库已经加载到物理内存了吗?如何理解这一点?

linux memory-management shared-libraries dynamic-linking linux-kernel

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

为什么 elf 的符号表中不包含 strlen ?

1.c使用调试信息进行编译:

\n
gcc -O0 -g ./1.c\n
Run Code Online (Sandbox Code Playgroud)\n
// 1.c\n#include <stdio.h>\n#include <string.h>\nint main() {\n  char c[222];\n  scanf("%s", c);\n  int a = strlen("dadw");\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我找不到strlen通过readelf -a a.outnm ./a.out。根据我的理解,strlen是由动态链接提供libc.so并解决的。所以它应该出现在符号表中。难道是gcc的一些特殊trick造成的?

\n
\xe2\x9d\xaf nm ./a.out       \n000000000000038c r __abi_tag\n0000000000004010 B __bss_start\n0000000000004010 b completed.0\n                 w __cxa_finalize@GLIBC_2.2.5\n0000000000004000 D __data_start\n0000000000004000 W data_start\n00000000000010b0 t deregister_tm_clones\n0000000000001120 t __do_global_dtors_aux\n0000000000003db8 d __do_global_dtors_aux_fini_array_entry\n0000000000004008 D __dso_handle\n0000000000003dc0 d _DYNAMIC\n0000000000004010 D _edata\n0000000000004018 B _end\n00000000000011cc T _fini\n0000000000001160 t frame_dummy\n0000000000003db0 d __frame_dummy_init_array_entry\n00000000000020e8 r __FRAME_END__\n0000000000003fb0 d …
Run Code Online (Sandbox Code Playgroud)

c linux dynamic-linking

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

在 C++ 编译期间提供链接库路径的 linux 命令是什么?

我记得看到过一些像这样工作的命令:

g++ main.cpp `some_forgotten_command --some_forgotten_options some_library`
Run Code Online (Sandbox Code Playgroud)

当命令运行时,它将用-I/path/to/some_library/includeand替换 `` 括起来的部分-L/path/to/some_library/lib/(或者类似的东西,我不太记得了)。但我不记得是什么some_forgotten_command了。

c++ linux linker dynamic-linking static-linking

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

在编译C时使用旧版本的共享linux库

我试图使用libfann版本2.0.1而不是最新版本2.2.0,但无法弄清楚如何这样做.有关如何做到这一点的任何想法?

通常是完美的:

gcc fann_calculator.c -o run_fann_calculator -lfann -lm
Run Code Online (Sandbox Code Playgroud)

其中fann_calculator.c包含一个调用神经网络的程序.

谢谢

linux ubuntu shared-libraries dynamic-linking fann

0
推荐指数
1
解决办法
1406
查看次数

C++中未解析的外部:Visual C++中的方法签名与dll中的损坏方法不同

我正在使用Visual Studio 2012,托管C++,在第三方SDK和我们用C#编写的系统之间建立桥梁.我成功地包装并使用了SDK中的几个函数.除了一个,只会导致未解决的外部错误.

SDK的头文件定义了函数的签名:

#if defined WIN32
    #if defined BUILD_ADS_SHARED_LIB
        #define ADS_LINK_SPEC __declspec (dllexport)
        #define ADS_CALLING_CONVENTION __stdcall
    #elif defined USE_ADS_SHARED_LIB
        #define ADS_LINK_SPEC __declspec (dllimport)
        #define ADS_CALLING_CONVENTION __stdcall
    #else
        #define ADS_LINK_SPEC
        #define ADS_CALLING_CONVENTION
    #endif
#else
    #define ADS_LINK_SPEC
    #define ADS_CALLING_CONVENTION
#endif

DatabaseResult ADS_LINK_SPEC ADS_CALLING_CONVENTION
createDatabase(
    const Settings& settings, Artec::SdkDatabase::iDatabase *& instance);
Run Code Online (Sandbox Code Playgroud)

错误说:

Error   10  error LNK2028: unresolved token (0A000089) "enum Artec::SdkDatabase::DatabaseResult __cdecl Artec::SdkDatabase::createDatabase(class Artec::SdkDatabase::Settings const &,class Artec::SdkDatabase::iDatabase * &)" (?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z) referenced in function "private: static enum Artec::SdkDatabase::DatabaseResult __clrcall Broadway3dWrapper::Broadway3dWrapper::GetConn(wchar_t const *,wchar_t const …
Run Code Online (Sandbox Code Playgroud)

c++ dll dynamic-linking visual-c++ visual-studio-2012

0
推荐指数
1
解决办法
1105
查看次数

如何使用关联图像显示随机选择的文本?

我是一名初学网页设计师,我需要知道如何将一件事与另一件事联系起来.问题是,每次网站刷新时,我都会更改不同的引号.我需要对位于不同div标签中的图像做同样的事情.我需要链接它们的原因是因为图像需要与引用协调.例如:引用0与图像0.

这是javascript代码:

var quotes=new Array();
quotes[0] = "text1";
quotes[1] = "Text2";
quotes[2] = "text3";
quotes[3] = "text4";

var q = quotes.length;
var whichquote=Math.round(Math.random()*(q-1));
function showquote(){document.write(quotes[whichquote]);}
showquote();
Run Code Online (Sandbox Code Playgroud)

这是位于javascript文本的代码:

<script language="javascript" type="text/javascript" src="quotes.js"></script>
Run Code Online (Sandbox Code Playgroud)

javascript quotes dynamic-linking page-refresh

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

如何在linux上为c ++创建动态库?

我想在linux上为c ++程序创建一个动态库.在c ++程序/系统中,我使用libconfig ++库,libpqxx库,一些boost和c ++ 11.

我的步骤:1)

g++ -Wall -I/usr/local/include/ -std=c++0x -lconfig++ -Wall -lpqxx -lpq -fPIC -c ../SourceFiles/DBHandler.cpp ../SourceFiles/ParamServer.cpp ../SourceFiles/Functions.cpp
Run Code Online (Sandbox Code Playgroud)

2)

g++ -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0   *.o
Run Code Online (Sandbox Code Playgroud)

3)

ln -sf libctest.so.1.0 libctest.so.1
Run Code Online (Sandbox Code Playgroud)

4)

ln -sf libctest.so.1.0 libctest.so
Run Code Online (Sandbox Code Playgroud)

5)编译

g++ -Wall -I/path/to/include-files -L/path/to/libraries program.cpp -I/usr/local/include/ -std=c++0x -lconfig++ -lpqxx -lpq -lctest -o prog
Run Code Online (Sandbox Code Playgroud)

执行上面的命令后:

/usr/bin/ld: cannot find -lctest
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

以下是参考: 在此处输入链接描述

c++ boost dynamic-linking dynamic-library c++11

0
推荐指数
1
解决办法
450
查看次数

使用“探测”从不同目录加载 dll

编译具有外部引用的 C# 项目时,引用的 dll 将被复制到项目的输出路径(exe 旁边)。

运行应用程序时,它期望找到 exe 旁边的 dll。

我正在寻找一种方法将我的 dll 文件分散到不同的目录(对于初学者来说是 Dlls)。并让 exe 在这些目录中查找 dll 文件。

例子:

假设我们有一个名为“App”的应用程序位于 下C:\App\App.exe,并且它使用了一个名为“App.dll”的 dll 文件,该文件当前也位于 下C:\App

我希望创建一个名为的新目录C:\App\Dlls并将 App.dll 文件移动到那里,同时确保 App.exe 文件知道在新位置查找 dll。

我在网上搜索并找到了探测解决方案。这是我的代码(编辑后的“App.config”文件):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas=microsoft-com:asm.v1">
      <probing privatePath="Dlls" />
    </assemblyBinding>
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我编译了我的应用程序,创建了 Dlls 目录并将所有 dll 文件移至该目录,但应用程序崩溃了。

我缺少什么?

c# loadlibrary dynamic-linking assemblybinding probing

0
推荐指数
1
解决办法
4686
查看次数

CUDA nvcc建立图书馆链

我的目标是:library2.so正在使用library1.somycode.o正在使用(库应该链接)library2.so(也许library1.so).

源代码是(省略一行头文件):

library1.cu:

__device__ void func1_lib1(void){}
Run Code Online (Sandbox Code Playgroud)

library2.cu:

#include "library1.h"
__global__ void func1_lib2(void)
{
    func1_lib1();
}
extern "C"
void func2_lib2(void)
{
    func1_lib2<<<1,1>>>();
}
Run Code Online (Sandbox Code Playgroud)

mycode.c中:

#include "library2.h"
int main(void)
{
    func2_lib2();
}
Run Code Online (Sandbox Code Playgroud)

我正在根据 Makefile 构建共享库

broken:
    rm -f *.o *.so
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library1.cu
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dlink -o cuda-lib1.o library1.o
    gcc  -shared -Wl,-soname,library1.so -o library1.so library1.o uda-lib1.o
    nvcc -arch=sm_30 --compiler-options '-fPIC' -dc library2.cu
    nvcc -arch=sm_30 --compiler-options '-fPIC' …
Run Code Online (Sandbox Code Playgroud)

cuda dynamic-linking nvcc

0
推荐指数
1
解决办法
1629
查看次数

来自dlsym的std :: function导致分段错误

我想动态链接共享库并从中分配一个函数std::function.这是代码:

function.cpp:

#include <array>

#ifdef __cplusplus
extern "C" {
#endif

double function(std::array<double, 1> arg)
{
    return arg[0] * 2;
}

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include <functional>
#include <iostream>
#include <fstream>
#include <array>
#include <functional>

#ifdef __linux__
#include <dlfcn.h>
#endif

int main()
{
void *handle;
double (*function)(std::array<double, 1>);
char *error;

handle = dlopen("/home/oleg/MyProjects/shared_library_test/libFunction.so", RTLD_LAZY);
if (!handle) 
{
    fprintf(stderr, "%s\n", dlerror());
    exit(EXIT_FAILURE);
}

dlerror();
*(void **) (&function) = dlsym(handle, "function");

if ((error = dlerror()) != NULL)
{
    fprintf(stderr, "%s\n", …
Run Code Online (Sandbox Code Playgroud)

c++ linux dynamic-linking dlsym std-function

0
推荐指数
1
解决办法
429
查看次数

为什么在gcc中需要-rdynamic选项?

默认情况下,所有符号都导出到动态表,那么为什么要使用-rdynamic标志?即使我们通过attribute /隐藏某些符号-fvisibility=hidden- -rdynamic不会更改结果,也不会取消隐藏先前隐藏的符号。那有什么意义呢?

gcc symbols shared-libraries elf dynamic-linking

0
推荐指数
1
解决办法
940
查看次数

为什么我的 main 没有从我的共享库中找到函数?

我在 4 个不同的文件中有 4 个独立的功能。函数如下所示:

埃拉托色尼筛网.cpp

bool SieveOfEratosthenes(int n) {
//
}
Run Code Online (Sandbox Code Playgroud)

他们都没有包括。在我的 main.cpp 程序中,我有

//Includes
void compare(bool (*f)(int)) {
//
}

int main(int argc, char **argv) {
  compare(isPrimeAKS);
  compare(isPrimeModulo);
  compare(isPrimeSQRT);
  compare(SieveOfEratosthenes);
  return 0;
}

Run Code Online (Sandbox Code Playgroud)

这是我的生成文件:

all: main clean

main: main.cpp lib.so
    g++ -o main main.cpp -L.

lib.so: EratosthenesSieve.o AKS.o ModuloAlg.o SQRTModuloAlg.o
    g++ -shared -o lib.so AKS.o ModuloAlg.o SQRTModuloAlg.o EratosthenesSieve.o

EratosthenesSieve.o: EratosthenesSieve.cpp
    g++ -c -Wall -fpic EratosthenesSieve.cpp

AKS.o: AKS.cpp
    g++ -c -Wall -fpic AKS.cpp

ModuloAlg.o: ModuloAlg.cpp
    g++ -c -Wall -fpic …
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-linking dynamic-library

0
推荐指数
1
解决办法
178
查看次数

为什么动态库可以链接到其他库,但静态库不能?

请考虑以下代码结构:

main.cpp -> depends on libone.a -> depends on libtwo.a

假设main.cpp仅使用函数libone.a.所以现实地,程序员写作main.cpp真的只关心libone.a.在这一点上,他们甚至不知道libone.a有依赖libtwo.a.

他们尝试按如下方式编译代码并获取链接器错误:

g++ -o main main.cpp -lone

在此输入图像描述 - 错误!未定义的符号!

这成为一个问题,因为libone.a依赖于libtwo.a,任何使用的人都libone.a必须知道这种依赖关系...正如你可以想象的那样,FAR可能会出现这个问题,而不是单个库的FAR更多的依赖关系,并且很快就会成为一个链接噩梦.


尝试1解决此问题:

第一种认为,解决这个问题是"很简单,我会只是链接libone.alibtwo.a当我编译libone.a!

事实证明它并不像我希望的那么简单......编译libone.a时无法链接libtwo.a.编译它们时,静态库不会链接到任何内容,而是在将库编译为可执行文件时必须链接所有依赖项.

例如,要编译main.cpp依赖于静态库,而静态库又依赖于另一个静态库,则必须链接这两个库.总是.

g++ -o main main.cpp -lone -ltwo


尝试2解决此问题:

另一个想法是尝试编译libone为链接到的动态库libtwo.a.

奇怪的是,这才有效!编译和链接libone.so主程序后,只需要关心libone.so,不再需要了解libtwo.a.

g++ -o main main.cpp -lone

成功!


经过这个练习后,仍然缺少一件.我似乎无法弄清楚为什么静态库不能在其他库中链接,但动态库可以.事实上,动态库 …

c++ linker dynamic-linking static-linking

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