Tôi đang làm việc trên một dự án C++ cần hai thư viện của bên thứ ba (libfoo.so và libbar.so). Hệ điều hành của tôi là Linux.Liên kết các thư viện với các phụ thuộc không tương thích
libfoo.so là tự động kết nối với libpng14.so.14 (1.4.8) (EDIT 1)
libbar.so dường như được liên kết tĩnh để
một phiên bản unknwon của libpng
libpng 1.2.8 (EDIT 1)
tôi nói "có vẻ là" bởi vì:
ldd libbar.so
không hiển thị gì về pngnm -D libbar.so | grep png_read_png
nói "004f41b0 T png_read_png"less libbar.so | grep png_read_png
nói "4577: 004f41b0 738 FUNC GLOBAL DEFAULT 10 png_read_png"
Khi tôi bắt đầu chương trình của tôi, nó hủy bỏ :
terminate called after throwing an instance of 'char const*'
Đây là gdb backtrace:
#0 0xb7ffd424 in __kernel_vsyscall()
#1 0xb5e776a1 in raise() from /lib/libc.so.6
#2 0xb5e78de2 in abort() from /lib/libc.so.6
#3 0xb60a997f in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6
#4 0xb60a78a5 in ??() from /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6
#5 0xb60a78e2 in std::terminate()() from /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6
#6 0xb60a7a21 in __cxa_throw() from /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6
#7 0xb5abf76d in ??() from /usr/lib/libfreeimage.so.3
#8 0xb6fb9346 in png_error() from lib/libfsdk.so
#9 0xb6fa2a59 in png_create_read_struct_2() from lib/libfsdk.so
#10 0xb6fa2b7a in png_create_read_struct() from lib/libfsdk.so
#11 0xb5abfa44 in ??() from /usr/lib/libfoo.so
#12 0xb5aa766b in FreeImage_LoadFromHandle() from /usr/lib/libfreeimage.so.3
#13 0xb5aa59f6 in FreeImage_LoadFromMemory() from /usr/lib/libfreeimage.so.3
#14 0xb68a94a5 in Foo::Image::load (this=0xb4eff560, input=...)
Như bạn thấy, ngoại lệ được ném vào Foo :: Hình ảnh :: tải thuộc libfoo.so
Vô hiệu hóa các phần của mã của tôi có sử dụng libbar.so và loại bỏ các liên kết đến nó, Foo :: Hình ảnh :: tải không ném bất kỳ ngoại lệ và hoạt động tốt.
Vì vậy, tôi đoán nó có thể là do một số sự mơ hồ trong bảng biểu tượng. Làm thế nào tôi có thể sửa chữa nó?
EDIT 1
png_access_version_number()
- Với libbar.so liên kết,
png_access_version_number()
trở10208
: phiên bản 1.2.8 - Without libbar.so liên kết,
png_access_version_number()
trở10408
: phiên bản 1.4.8
Bạn phải sử dụng 'nm -D' để xem các dynsym của thư viện được chia sẻ. Chỉ 'nm' là dành cho các biểu tượng gỡ lỗi, được loại bỏ trong hầu hết các bản phân phối. –
@ jørgensen, cảm ơn bạn! –
Tôi đang cố gắng hiểu phiên bản libpng nào được liên kết tĩnh với * libbar.so * –