【发布时间】:2017-04-27 10:13:09
【问题描述】:
操作系统:基于 arm 的 Linux。
编程语言:C、C++
编译器:arm gcc
我们构建了一个共享库(我们称之为 libFoo.so),它依赖于某个 SQLite 版本。 SQLite 库是静态编译的,并与 libFoo.so 链接。它们都以隐藏可见性 (-fvisibility=hidden) 编译,并且 libFoo.so 仅导出其 API 符号,因此使用“nm -D libFoo.so”看不到 SQLite 符号。这是为了避免符号冲突。 这个共享库只对一组特定的数据库文件执行读操作。这些数据库预计只能通过 libFoo.so 打开。
我们的合作伙伴使用 libFoo.so 构建应用程序,并从平台链接到 Qt 服务框架。 Qt 服务框架依赖于平台上的 SQLite 共享库,它的版本与我的不同。这意味着这个过程会加载两个 SQLite 库副本,但来自 libFoo.so 的那个是隐藏的。
问题:
我最终会遇到How to corrupt - Multiple copies of SQLite linked into the same application 中提到的数据库损坏问题的可能性有多大?我很好奇它可能出错的情况。
SQLite 保留一个打开的 SQLite 数据库文件的全局列表。 SQLite 共享库是否有机会从 SQLite 静态库访问打开的数据库文件的全局列表?
在上面的 SQLite 页面中,提到了一个解决方案,它只链接一个 SQLite 库的副本,这意味着更改我无法访问的平台的构建过程。
我搜索了一下,发现了一个有趣的讨论:
- 在The multiple SQLite problem 中,有一条评论指出可以像我一样使用 SQLite 作为静态库并隐藏 SQLite 符号。
谢谢!
【问题讨论】: