[英]How to compile to avoid shared library errors?
我需要使用MySQL C API開發程序。 我將在CentOS虛擬機上開發它,並在RedHat服務器上運行它。 我編譯了某種Hello World程序並將其傳輸到服務器。 但是我收到有關共享庫的錯誤。
$ ./test1
./test1: error while loading shared libraries: libssl.so.10: cannot open shared object file: No such file or directory
我看到該庫存在,但名稱略有不同:
$ ls -l /usr/lib/libssl*
-rw-r--r-- 1 root root 458752 Aug 13 17:27 /usr/lib/libssl.a
lrwxrwxrwx 1 root root 26 Sep 14 01:26 /usr/lib/libssl.so -> ../../lib/libssl.so.0.9.8er
-rwxr-xr-x 1 root root 217560 Nov 9 12:22 /usr/lib/libssl3.so
由於我不是root用戶,因此不能簡單地建立符號鏈接。 我會將我的程序分發給許多沒有root特權和系統管理技能的人。 有編譯我的程序的安全方法以避免此類錯誤嗎?
這是我的簡單程序:
#include <my_global.h>
#include <mysql.h>
int main(int argc, char **argv)
{
printf("MySQL client version: %s\n", mysql_get_client_info());
}
而且,這就是我的編譯方式:
gcc version.c -o version `mysql_config --cflags --libs`
ldd ./test1的輸出:
linux-gate.so.1 => (0x00685000)
libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 (0x00a8c000)
libz.so.1 => /lib/libz.so.1 (0x00110000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00240000)
libnsl.so.1 => /lib/libnsl.so.1 (0x002b7000)
libm.so.6 => /lib/libm.so.6 (0x00f5a000)
libssl.so.10 => /usr/lib/libssl.so.10 (0x00e0c000)
libcrypto.so.10 => /usr/lib/libcrypto.so.10 (0x002d1000)
libc.so.6 => /lib/libc.so.6 (0x004d3000)
libfreebl3.so => /lib/libfreebl3.so (0x00686000)
/lib/ld-linux.so.2 (0x00977000)
libgssapi_krb5.so.2 => /lib/libgssapi_krb5.so.2 (0x006ea000)
libkrb5.so.3 => /lib/libkrb5.so.3 (0x00123000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x00804000)
libk5crypto.so.3 => /lib/libk5crypto.so.3 (0x001f4000)
libresolv.so.2 => /lib/libresolv.so.2 (0x0021b000)
libdl.so.2 => /lib/libdl.so.2 (0x00dbf000)
libkrb5support.so.0 => /lib/libkrb5support.so.0 (0x00234000)
libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00f0b000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00e72000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00862000)
mysql_config --cflags --libs的輸出:
-I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv -fPIC -DUNIV_LINUX
-rdynamic -L/usr/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -lssl -lcrypto
閱讀ld.so
及其變量(例如LD_LIBRARY_PATH
和LD_PRELOAD
-您可以在自己的~/lib/
安裝libssl.so
,讓動態鏈接程序找到它。
不用說,您最好通過軟件包管理系統來執行此操作。
您的二進制文件是針對openssl 1.0.x版編譯的,因此需要openssl主要版本1。目標計算機的版本為0.9.8,后者為主要版本0。不同的主要版本被認為不兼容,因此會出現錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.