最近,我在OSX程序中添加了一些动态插件行为,该程序按照设计的方式工作。但是,在Linux (泛型)上尝试相同的方法失败,因为dlsym()库调用无法以在OSX中正常工作的方式解析符号。
从阅读man dlsym可以明显看出,系统调用在这两种体系结构中的实现非常不同,但我认为最基本的情况也是一样的,但显然并非如此。
下面的示例(虚拟)在OSX中运行良好,但在Linux中不起作用。
在Linux中,有什么解决办法可以让它以同样的方式解析符号吗?
// Needed to make RTLD_DEFAULT available on GNU/Linux
#define _GNU_SOURCE
#
我已经成功地在Linux x86_x64上构建了几个32位的静态和共享库,现在我试图将它们链接到一个可执行文件,并得到以下错误:
/usr/bin/ld: foo.so: __moddi3: invalid version 21 (max 0)
foo.so: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
其中foo.so是我构建的共享库之一。
__moddi3函数是的一部分。它的签署是:
— Runtime Function: long __moddi3 (long a, long b)
在global.c文件中定义了一些全局变量,如下所示:
int globalvar;
我有一个头文件global.h将这个变量声明为extern
extern int globalVar;
现在我有了main.c,它与已编译的global.o (从global.c编译)链接,它具有打开(使用dlopen)的代码,共享对象sh.so是从sh.c构建的,通过global.h访问globalVar。尽管我的可执行文件定义了globalVar (静态链接),但是当我加载动态链接库sh.so时,它表示未定义的globalVar。怎么处理这个?
我对dlls不太了解。我在网上读一本书。其中作者指的是Exporting a function from a DLL。他告诉怎么做,但他没有告诉它是什么,为什么要做呢?
他建议的方法是: a)用extern "C"标记函数(不知道为什么?)b)创建一个DEF文件,并在此DEF文件的导出部分中添加函数名。再一次,不知道为什么和具体发生了什么?
我不明白的另一件事是术语symbols/symbol table。
Exporting a function from a DLL是什么意思?
什么是symbols/symbol table?
如果有人能用简单、清楚和详细的
SDL_android.c项目包含一个SDL2活动类(SDLActivity),它传递C库的名称,并在其中使用对nativeRunMain()的JNI调用来回调SDL_android.c。然后使用dlopen和dlsym动态调用C回调。
但是,在运行adb logcat时,nativeRunMain()说它是Couldn't find function main in library lib<android-binary>.so。
我的cc_library定义如下所示:
cc_library(
name = "main",
srcs = ["
我有一个问题,当将静态库和.o文件链接到共享的libray时缺少符号。我检查了静态libray的符号表,正常情况下,我需要在该表中列出这些函数,如下所示:
...
00000000 g F .text 000000b0 av_int2dbl
...
000000b0 g F .text 00000060 av_int2flt
但是,当我生成共享库、av_int2dbl和av_int2flt以及其他遗漏的函数(它们通常都在静态符号表中列出)时,我使用了一种愚蠢的方法来解决这个问题,通过在.o文件中创建一个虚拟函数,并引用虚拟函数中遗漏的函数,共享库的动态符号表添加了一些以前没
我们有一个在许多静态库中链接的程序,根据编译选项,这些程序可能定义或不定义多个符号。在OS上,我们使用带有空句柄的dlsym(3)来获取符号地址。但是,在Linux上,dlsym(3)总是返回NULL。
考虑一个简单的程序(下面的源代码),它链接到包含函数和变量的静态库中,并试图打印它们的地址。我们可以检查程序是否包含以下符号:
$ nm -C test | grep "test\(func\|var\)"
0000000000400715 T testFunc
0000000000601050 B testVar
但是,当程序运行时,两者都找不到:
$ ./test
test
int myvar=100;
main()
{
pid_t (*f) (void );
int *ip;
int myvar=10;
f = (pid_t(*) (void)) dlsym(RTLD_NEXT, "getpid");
ip = (int *) dlsym(RTLD_NEXT, "errno");
if (ip)
printf("%d \r\n", *ip);
ip = (int *) dlsym(RTLD_NEXT, "myvar");
if (ip)
pri
我正在使用gdb分析一个核心转储文件。可执行文件链接到共享库,可执行文件和共享库都使用-g标志进行编译,在bt中,我可以看到可执行文件中的num行,但看不到共享库。有什么办法解决这个问题吗? 我以这种方式打开核心文件: gdb /path/to/executable /path/to/core/file (gdb) bt
#0 0x00007f4e7711b438 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54
#1 0x00007f4e7711d03a in __GI_abort () a
我是JNA的新手。我正在尝试访问DLL中的方法。我得到以下错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'GetACSStatus': The specified procedure could not be found.
at com.sun.jna.Function.<init>(Function.java:179)
at com.sun.jna.NativeLibrary.getFunction(Na
我正在做一个关于视频监控的项目,其中车辆必须从视频中跟踪,并必须确定哪一辆车是它。我正在使用opencv。我在其中使用了斑点跟踪。有没有其他方法可以使用opencv来检测车辆。我是opencv的新手。我在查看blob跟踪头文件时发现一条语句,如下所示:
class CV_EXPORTS CVVsModule
这是什么意思。CV_EXPORTS是用来做什么的。它是用很多类编写的。它的意义是什么。也告诉我如何接近我的项目。这对我来说真的很重要。