假设我有一个共享库a.so,它是由我的可执行文件第一次加载的。我的理解是,共享库文本部分被映射到VMA的中间。我有两个问题;
(1) ld.so是否会将这个共享内存文本节页面加载到物理内存,然后映射到该进程的VMA?
(2) 假设启动了使用相同共享库的第二个可执行文件a.so。ld.so会识别出这个共享库已经加载到物理内存了吗?如何理解这一点?
linux memory-management shared-libraries dynamic-linking linux-kernel
我1.c使用调试信息进行编译:
gcc -O0 -g ./1.c\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n但我找不到strlen通过readelf -a a.out或nm ./a.out。根据我的理解,strlen是由动态链接提供libc.so并解决的。所以它应该出现在符号表中。难道是gcc的一些特殊trick造成的?
\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) 我记得看到过一些像这样工作的命令:
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了。
我试图使用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包含一个调用神经网络的程序.
谢谢
我正在使用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) 我是一名初学网页设计师,我需要知道如何将一件事与另一件事联系起来.问题是,每次网站刷新时,我都会更改不同的引号.我需要对位于不同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) 我想在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# 项目时,引用的 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 文件移至该目录,但应用程序崩溃了。
我缺少什么?
我的目标是:library2.so正在使用library1.so和mycode.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) 我想动态链接共享库并从中分配一个函数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) 默认情况下,所有符号都导出到动态表,那么为什么要使用-rdynamic标志?即使我们通过attribute /隐藏某些符号-fvisibility=hidden- -rdynamic不会更改结果,也不会取消隐藏先前隐藏的符号。那有什么意义呢?
我在 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) 请考虑以下代码结构:
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更多的依赖关系,并且很快就会成为一个链接噩梦.
第一种认为,解决这个问题是"很简单,我会只是链接libone.a与libtwo.a当我编译libone.a!
事实证明它并不像我希望的那么简单......编译libone.a时无法链接libtwo.a.编译它们时,静态库不会链接到任何内容,而是在将库编译为可执行文件时必须链接所有依赖项.
例如,要编译main.cpp依赖于静态库,而静态库又依赖于另一个静态库,则必须链接这两个库.总是.
g++ -o main main.cpp -lone -ltwo
另一个想法是尝试编译libone为链接到的动态库libtwo.a.
奇怪的是,这才有效!编译和链接libone.so主程序后,只需要关心libone.so,不再需要了解libtwo.a.
g++ -o main main.cpp -lone
成功!
经过这个练习后,仍然缺少一件.我似乎无法弄清楚为什么静态库不能在其他库中链接,但动态库可以.事实上,动态库 …
dynamic-linking ×13
c++ ×6
linux ×5
linker ×2
boost ×1
c ×1
c# ×1
c++11 ×1
cuda ×1
dll ×1
dlsym ×1
elf ×1
fann ×1
gcc ×1
javascript ×1
linux-kernel ×1
loadlibrary ×1
nvcc ×1
page-refresh ×1
probing ×1
quotes ×1
std-function ×1
symbols ×1
ubuntu ×1
visual-c++ ×1