这是一个特定于类 UNIX 操作系统的答案,如果它对您的问题没有意义,但我不太了解您的平台,我深表歉意。只需不要创建动态链接的可执行文件。
我可以想到两种方法来做到这一点。方法#2 可能最适合您。他们都很相似。
对两者都很重要,可执行文件必须-static
在构建时使用静态编译
- 方法 1 - 静态 exe,通过其受信任的完整路径手动加载共享库
通过完整路径手动dlopen
获取所需的每个库,然后dlsym
在运行时通过获取函数地址并将它们分配给函数指针以使用它们。您需要为要使用的每个外部函数执行此操作。我相信可重入不安全函数不会喜欢这样,所以对于那些使用静态变量的函数 - 你需要使用可重入安全版本,这些以“_r”结尾,即使用strtok_r
而不是strtok
这将是困难或简单,具体取决于您的应用程序做什么以及您正在使用多少功能。
- 方法 2 - 静态链接可执行文件,句号
您可以通过仅链接静态可执行文件来完全避免使用动态库来解决您的颠覆问题。dlopen()/dlsym()
这将生成比该方法大得多的 exe 。使用-static
编译标志而不是使用来构建,例如gcc bah.c -o bah lssl
使用gcc -static bah.c -o bah /usr/lib/libssl.a
您需要的库的静态编译版本而不是动态共享库。换句话说,在构建时使用-static
和不使用-l
对于任何一种方法:
- 构建后,用于
file bah
确认可执行文件是静态链接的。ldd
或通过运行确认
- 请注意,您需要系统中存在的所有要链接的库的静态编译版本。这些文件以
.a
而不是.so
)结尾
- 另请注意,升级系统库不会更新您的可执行文件。如果 OpenSSL 中有新的安全漏洞,您需要获取最新的 libssl.a 并重新编译它。如果您使用该
dlopen()/dlsym()
方法,则不会出现此问题,但如果符号在不同版本中发生更改,则会出现可移植性问题
根据您的需求,每种方法都有其优点和缺点。
采用方法 1dlopen
和dlsym
方法会使您的代码更加“模糊”且更小,但在大多数情况下会牺牲可移植性,因此可能不是您想要的。好处是,当安全漏洞在系统范围内得到修复时,它可能会受益。