我使用Windows编译器使用*.so对象代码文件(C源代码)创建了一个共享库( *.o )。
我将这个共享对象与一个应用程序(在Linux主机上使用gcc作为ARM目标)链接起来,并获得一个可执行文件,在运行时生成分段错误。(我知道我必须调试它!)
与创建共享库不同,如果我创建了一个具有相同源文件的静态库,然后链接到应用程序,然后执行应用程序,那么它可以正常工作。
所以我的问题是:
main() )如何解析要执行库函数的地址?发布于 2009-04-16 14:32:49
这就是它在linux上的工作方式:
不,你什么都不用做。但是,可以使用gcc -fvisibility命令行参数限制导出变量,并使用可见性属性显式标记导出的条目。
2)可执行文件将包含它导入的所有函数(这些都是具有默认可见性的函数)。加载器/链接器将选择一个地址来加载库,并在运行之前填充该表,对这些函数的调用是间接调用。(注意,这也适用于共享对象)
3)静态链接是在链接时间(编译后)执行的。实际地址在程序集中被替换,它们是直接调用。
注意:有一个叫做PIC (位置独立代码)的东西。AFAIK,它处理对同一个共享对象中的数据/函数的引用,因此链接器在加载库时不需要覆盖库的一半代码,就像代码不对自己的数据进行任何绝对引用一样。你可以试着用它做实验。
发布于 2011-04-02 03:22:26
gcc导出符号,因为默认情况下它会导出所有符号;但是,RVDS可能会也可能不会这样做。检查您的RVDS编译器文档(尝试将其配置为“可重定位ELF”输出?)我唯一的猜测是,您的编译器正在输出的代码在运行时是不可重定位的。这对我来说是个谜,但如果不打破静态库,怎么会发生呢?
如果要从RVDS直接生成静态库和共享库,可以选择尝试将静态库转换为共享库:
gcc -shared -o libfoo.so libfoo.a如果这有帮助,那么RVDS的共享库链接器(或其配置)可能会被破坏。
发布于 2009-05-20 05:23:25
你知道坠机的原因吗?
如果要动态加载共享库(例如通过dlopen()),一种可能是假设库在未加载时加载OK,然后尝试通过空指针执行函数。
https://stackoverflow.com/questions/756174
复制相似问题