2009-11-20 42 views
6

Xin lỗi nếu đây là một câu hỏi rõ ràng, nhưng tôi đã tìm thấy một số ... Tài liệu tham khảo và cung cấp cho chúng tôi dưới dạng tệp nhị phân .so, được xây dựng trên Fedora 11. Chúng tôi đã thử nghiệm API trên một máy phát triển Fedora 11 mà không có vấn đề gì. Tuy nhiên, khi tôi cố gắng liên kết với API trên nền tảng mục tiêu của khách hàng, điều này xảy ra là SuSE Enterprise 10.2, tôi nhận được lỗi "Định dạng tệp không được nhận dạng".Khả năng tương thích nhị phân giữa các bản phân phối Linux

Lệnh cũng là một phần của gói binutils, chẳng hạn như objdump hoặc nm, cho tôi lỗi định dạng tệp tương tự. Các "tập tin" lệnh cho tôi:

ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped 

và "ldd" lệnh show:

ldd: warning: you do not have execution permission for `./libuscuavactivity.so.1.1' 
./libuscuavactivity.so.1.1: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./libuscuavactivity.so.1.1) 
[dependent library list] 

Tôi đoán đây là do sự không tương thích giữa các thư viện C trên hai nền tảng, với vấn đề là mã được biên dịch dựa trên phiên bản mới của glibc vv so với phiên bản có sẵn trên SuSE 10.2. Tôi đang đăng câu hỏi này về cơ hội không có cách nào để biên dịch mã trên nền tảng Fedora 11 của đối tác của chúng tôi theo cách mà nó cũng sẽ chạy trên SuSE 10.2.

+2

trên cùng một kiến ​​trúc? (i386! = amd64) – elmarco

+0

Tôi nên đề cập rằng nền tảng xây dựng và nền tảng SuSE 10.2 mục tiêu đều là x86_64. –

+0

Bạn kiểm tra định dạng tệp với objdump hoặc bằng cách thực thi .so (có, điều này là có thể). Nó sẽ là ELF, bởi vì nó được sử dụng từ thời kỳ đồ đá. Nếu bạn có phiên bản libc không tương thích, bạn sẽ nhận được thông báo lỗi cho biết chính xác điều đó - vì vậy, khả năng đoán của bạn rất có thể là sai và vấn đề có thể khác. – hirschhornsalz

Trả lời

4

Tôi nghĩ rằng mẹo là xây dựng trên một hương vị của Linux với phiên bản thư viện hạt nhân và C cũ nhất của bất kỳ nền tảng nào bạn muốn hỗ trợ. Trong công việc của tôi, chúng tôi xây dựng trên Debian 4, cho phép chúng tôi chính thức hỗ trợ Debian 4 trở lên, RedHat 3,4,5, SuSE 10 cộng với các bản phân phối khác (SELinux, vv) theo cách không chính thức.

Tôi nghi ngờ bằng cách xây dựng trên một phiên bản Linux mới tốt đẹp, nó trở nên khó khăn để hỗ trợ mọi người trên các máy cũ hơn.

(chỉnh sửa) Tôi nên đề cập rằng chúng tôi sử dụng trình biên dịch mặc định đi kèm với Debian 4, mà tôi nghĩ là GCC 4.1.2. Cài đặt phiên bản trình biên dịch mới hơn có xu hướng làm cho khả năng tương thích tồi tệ hơn nhiều.

3

Windows có vấn đề với tính tương thích giữa các bản phát hành khác nhau, gói dịch vụ, SDK được cài đặt và DLL nói chung (DLL Hell, bất kỳ ai?). Linux không miễn dịch với cùng một loại vấn đề.

Những vấn đề tương thích Tôi đã thấy bao gồm:

  • Runtime thư viện thay đổi
  • thư viện liên kết thay đổi
  • Kernel thay đổi
  • biên dịch thay đổi công nghệ (ví dụ: trước và sau khi phiên bản gcc EGCS sức này. là vấn đề của bạn).
  • vấn đề Packager (RPM vs APT)

Trong trường hợp cụ thể của bạn, tôi muốn có họ làm một "gcc -v" trên hệ thống của họ và báo cáo cho bạn biết số lượng phiên bản gcc. So sánh điều đó với những gì bạn đang sử dụng.

Bạn có thể phải giữ phiên bản trình biên dịch đó để tạo một nửa.

1

Nếu thông báo là định dạng tệp không được nhận dạng thì vấn đề có nhiều khả năng được đề cập bởi elmarco trong nhận xét - cụ thể là kiến ​​trúc khác. Nó có thể (tôi không chắc chắn) là một phiên bản liên kết động không phù hợp, nhưng điều đó có nghĩa là tập tin .so được xây dựng với một liên kết năng động cổ xưa.Tôi không tin rằng bất kỳ sự không tương thích trong libc có thể gây ra điều này - chúng có thể gây ra lỗi liên kết và các vấn đề thời gian chạy (sau này rất hiếm khi), nhưng không phải điều này.

0

Tôi không biết về Suse, nhưng tôi biết fedora thích ở lại trên cạnh chảy máu. Vì vậy, bạn rất có thể đúng về các phiên bản thư viện. Tại sao bạn không hỏi và xem liệu bạn có thể lấy mã nguồn và xây dựng nó trên máy Suse của bạn?

3

Bạn có thể sử dụng ứng dụng Linux Checker công cụ ([1], [2], [3]) để giải quyết vấn đề tương thích của ứng dụng giữa các bản phân phối Linux. Nó sẽ kiểm tra định dạng tệp của bạn và tất cả các thư viện phụ thuộc. Nó hỗ trợ hầu như tất cả các bản phân phối Linux phổ biến bao gồm tất cả các phiên bản của SuSE và Fedora.

enter image description here

2

Đây chỉ là một ý kiến ​​cá nhân, nhưng khi phân phối một cái gì đó trong hệ nhị phân chỉ tạo trên Linux, bạn có một vài lựa chọn:

  1. Xây dựng gam của .debs và .rpms cho mọi bản phân phối dưới ánh nắng mặt trời, với gói ".tar.gz đầy đủ các tệp nhị phân" danh nghĩa cho mọi thứ bạn đã bỏ lỡ. Phần đầu là lý tưởng nhưng rườm rà. Phần sau sẽ dẫn bạn đến điểm 2 và 3.

  2. Làm như một số gợi ý và tìm thấy bản phân phối lâu đời nhất mà bạn có thể tìm thấy và xây dựng ở đó. Ý kiến ​​của riêng tôi là đây là một ý tưởng vô lý. Xem điểm 3.

  3. Phân phối tệp nhị phân và liên kết tĩnh nơi bạn có thể. Đặc biệt cho libstdC++, dường như là vấn đề của bạn ở đây. Có vẻ như rất nhiều phiên bản libstdC++ không tương thích nổi xung quanh, làm cho nó trở thành một cơn ác mộng tương thích. Nếu bạn không thể liên kết tĩnh, bạn cũng có thể đặt các tệp * .so cùng với tệp nhị phân của mình và sử dụng các công cụ như LD_PRELOAD hoặc LD_LIBRARY_PATH để làm cho chúng liên kết ưu tiên khi chạy. Lưu ý rằng nếu bạn thực hiện tuyến đường này, bạn có thể phải tuân thủ LGPL, v.v. vì bạn hiện đang phân phối công việc của người khác cùng với dự án của bạn.

Tất nhiên, phân phối dự án của bạn dưới dạng nguồn luôn được ưu tiên trên Linux. :-)

Các vấn đề liên quan