gol*_*ean 5 linux arm shared-libraries cross-compiling rvds
我使用Windows Host上的RVDS编译器*.so使用*.o目标代码文件(C源代码)创建了一个共享库().
我将此共享对象与应用程序(gcc在Linux主机上用于ARM目标)链接并获取可执行文件,该文件在运行时会生成分段错误.(我知道我必须调试它!)
如果我创建一个具有相同源文件的静态库,然后与应用程序链接,然后执行应用程序,它可以正常工作,而不是创建共享库.
所以我的问题是:
我是否需要使用某些结构在源文件中显式导出符号(导出到应用程序的函数)或任何其他符号,以便在与应用程序链接时正常工作?需要什么,我该怎么做?
共享库如何工作?即,在创建库时,将在库中给出将加载和运行函数的地址.application(main())如何解析要执行库函数的地址?
静态库如何工作,即如何在静态库的情况下解决规范和解决问题?
jpa*_*cek 12
这是它在linux上的工作方式:
1)不,你不需要做任何事情.但是,您可以使用gcc -fvisibility命令行参数限制导出变量,并使用visibility属性显式标记导出的条目.
2)可执行文件将包含它导入的所有函数的表(这些函数都是具有默认可见性的函数).加载器/链接器将选择一个地址来加载库并在运行之前填充该表,对这些函数的调用是间接调用.(请注意,这也适用于共享对象)
3)在链接时执行静态链接(在编译之后).实际地址在程序集中被替换,它们是直接调用.
注意:有一个名为PIC(位置无关代码)的东西.AFAIK,它处理对同一共享对象中的数据/函数的引用,因此链接器在加载库时不需要覆盖库的一半代码,代码不会对其进行任何绝对引用.自己的数据.您可以尝试尝试一下.
| 归档时间: |
|
| 查看次数: |
26971 次 |
| 最近记录: |