Liệu nhị phân linux của tôi sẽ hoạt động trên tất cả các bản phát hành?


24

Tôi tìm thấy một IDE thay thế tốt cho Delphi được gọi là Lazarus. Nhưng tôi không có câu hỏi nào cho các lập trình viên.

Liệu nhị phân Linux được liên kết tĩnh có hoạt động trên tất cả các bản phân phối Linux không? Tức là không có vấn đề gì với bản phân phối Linux mà tôi đã xây dựng và nó sẽ hoạt động trên Debian / ArchLinux / Ubuntu / OpenSUSE / ... bất cứ điều gì?

Theo kết quả của những phát hiện của tôi, thực sự chỉ có vấn đề 32bit so với 64 bit? Tôi muốn chắc chắn trước khi tôi xuất bản.



Bạn có thể cụ thể hơn về loại thư viện bạn dự định liên kết chương trình của bạn với? Một số thư viện có các phụ thuộc ẩn (tệp dữ liệu, hệ thống con động) hoặc các giả định ngầm định khác về hệ thống mà chúng đang chạy.
Thomas Erker

Câu trả lời:


29

Câu trả lời này lần đầu tiên được viết cho câu hỏi chung chung hơn "liệu nhị phân của tôi có chạy trên tất cả các bản phân phối không", nhưng nó giải quyết các nhị phân được liên kết tĩnh trong nửa sau.


Đối với bất cứ điều gì phức tạp hơn một thế giới xin chào được liên kết tĩnh, câu trả lời có lẽ là không .
Nếu không kiểm tra nó trên bản phân phối X, giả sử câu trả lời không cho X.

Nếu bạn muốn gửi phần mềm của mình ở dạng nhị phân, hãy giới hạn bản thân

  • một vài bản phân phối phổ biến cho lĩnh vực sử dụng phần mềm của bạn (máy tính để bàn, máy chủ, được nhúng, ...)

  • một hoặc hai phiên bản mới nhất của mỗi phiên bản

Nếu không, bạn kết thúc với hàng loạt phân phối của tất cả các kích cỡ, phiên bản và độ tuổi (phân phối mười năm vẫn được sử dụng hỗ trợ).

Kiểm tra cho những người. Chỉ cần một vài con trỏ về những gì có thể (và sẽ) đi sai:

  • Gói công cụ / thư viện bạn cần được đặt tên khác nhau trên các bản phân phối và thậm chí các phiên bản của cùng một bản phân phối

  • Các thư viện bạn cần quá mới hoặc quá cũ (phiên bản sai). Đừng cho rằng chỉ vì chương trình của bạn có thể liên kết, nó liên kết với đúng thư viện.

  • Cùng một thư viện (tệp trên đĩa) được đặt tên khác nhau trên các bản phân phối khác nhau, khiến cho việc liên kết là không thể

  • 32 bit trên 64 bit: môi trường 32 bit có thể không được cài đặt hoặc một số thư viện 32 bit không cần thiết được chuyển sang gói bổ sung ngoài môi trường 32on64, vì vậy bạn có một phụ thuộc thêm chỉ trong trường hợp này.

  • Shell: đừng giả sử phiên bản Bash của bạn. Đừng giả sử ngay cả Bash.

  • Công cụ: không cho rằng một số công cụ dòng lệnh POSIX không tồn tại ở bất cứ đâu.

  • Công cụ: không cho rằng công cụ nhận ra một tùy chọn chỉ vì phiên bản GNU của bản phân phối của bạn.

  • Giao diện hạt nhân: Đừng giả sử sự tồn tại hoặc cấu trúc của tệp /procchỉ vì chúng tồn tại / có cấu trúc trên máy của bạn

  • Java: bạn có thực sự chắc chắn rằng chương trình của bạn chạy trên JRE của IBM khi được vận chuyển với SLES mà không cần kiểm tra nó không?

Tiền thưởng:

  • Tập lệnh: nhị phân được biên dịch trên máy của bạn không chạy trên phần cứng cũ.

Liên kết tĩnh (hoặc: gói tất cả các thư viện bạn cần với phần mềm của bạn) có phải là một giải pháp không? Ngay cả khi nó hoạt động về mặt kỹ thuật, chi phí liên quan có thể cao. Thật không may, câu trả lời có lẽ là không.

  • Bảo mật: bạn chuyển trách nhiệm cập nhật các thư viện từ người dùng phần mềm của bạn sang chính bạn.

  • Kích thước và độ phức tạp: chỉ để giải trí, hãy thử xây dựng chương trình GUI được liên kết tĩnh.

  • Khả năng tương tác: nếu phần mềm của bạn là "plugin" dưới bất kỳ hình thức nào, bạn phụ thuộc vào phần mềm gọi cho bạn.

  • Thiết kế thư viện: nếu bạn liên kết chương trình của mình một cách tĩnh với GNU libc và sử dụng các dịch vụ tên ( getpwnam()v.v.), thì cuối cùng bạn sẽ được liên kết động với NSS (chuyển đổi dịch vụ tên) của libc.

  • Thiết kế thư viện: thư viện bạn liên kết chương trình của bạn một cách tĩnh với việc sử dụng các tệp dữ liệu hoặc các tài nguyên khác (như múi giờ hoặc địa phương).


Đối với tất cả các lý do nêu trên, thử nghiệm là cần thiết.

  • Làm quen với KVM hoặc các kỹ thuật ảo hóa khác và có VM của mọi Phân phối mà bạn dự định hỗ trợ. Kiểm tra phần mềm của bạn trên mọi VM.

  • Sử dụng cài đặt tối thiểu của các phân phối.

  • Tạo một VM với một tập lệnh bị hạn chế (ví dụ: không có SSE 4).

  • Chỉ được liên kết tĩnh hoặc được gói: kiểm tra các nhị phân của bạn lddđể xem liệu chúng có thực sự được liên kết tĩnh / chỉ sử dụng các thư viện được gói của bạn hay không.

  • Chỉ liên kết tĩnh hoặc được gói: tạo một thư mục trống và sao chép phần mềm của bạn vào đó. chrootvào thư mục đó và chạy phần mềm của bạn.


Đó là một câu trả lời khá toàn diện +1
vòng xoáy

2
Shell: Đặc biệt, Debian không sử dụng bash và vì điều đó đã giảm thiểu rất nhiều lỗ hổng Shellshock trên các hệ thống Debian, tôi không thể tưởng tượng được nó sẽ thay đổi trong tương lai trước mắt.
Kevin

1
Ngoài ra, nếu bạn muốn gửi nhị phân, liên kết chúng tĩnh .
dùng253751

Tại sao "tập lệnh" được gọi là "phần thưởng"? Nếu bạn phân phối ở dạng nhị phân, bạn thực sự cần phải xem xét ISAs nào bạn sẽ biên dịch. Bạn có thể không quan tâm đến người dùng m68k, nhưng ít nhất khó có thể bỏ qua ARM, IA32 và X86_64.
Toby Speight

@TobySpeight Hãy nghĩ về SSE4 và như vậy. Chỉ có thể cắn bạn nếu bạn sử dụng lắp ráp.
Thomas Erker

9

Câu trả lời là nó phụ thuộc. , nhưng trong hầu hết các trường hợp, có, miễn là các thư viện cần thiết được cài đặt trên HĐH.

Nói chung, hầu hết các phân phối lớn như những gì bạn đã đề cập đều có các công cụ quản lý gói cài đặt phiên bản ứng dụng được cộng đồng duy trì. Điều này quan tâm đến bất kỳ gói điều kiện tiên quyết nào mà ứng dụng sẽ cần. Nếu bạn đang cài đặt nó mà không có trình quản lý gói, bạn phải đảm bảo tất cả các gói và thư viện cần thiết được cài đặt trên HĐH. Đó là một ý tưởng tốt để bao gồm một danh sách các ứng dụng tiên quyết này trong tài liệu.


2

Câu trả lời xảo quyệt trước: Nó phụ thuộc

Nếu bạn đang phát hành mã nhị phân, giả sử câu trả lời là "không", trừ khi bạn đang phân phối tất cả các libs rằng nó bao giờ liên quan đến với nó (từ mặt đất lên, đó là gây phiền nhiễu, trừ khi bạn đang cung cấp một hệ thống thực sự khổng lồ đứng trên nào của riêng mình ) hoặc là liên kết tĩnh tương đương.

... nhưng phù thủy và tiền bạc, và phù thủy tiền bạc ...

IBM có một số trình cài đặt "Unixish nói chung" đã gây sốc cho tôi khi làm việc ở mọi nơi tôi đã thử chúng: một số Linuces từ một số thế hệ kernel, OpenSolaris (hoặc bất cứ thứ gì nó được gọi là bây giờ), Solaris và BSD. Nhưng chúng rất lớn. Và những thứ họ cung cấp cũng lớn không kém. Không có chương trình đua xe nhỏ nào được xuất bản theo cách này, chỉ là những thứ enterprisey lớn mà bạn mong đợi từ IBM.

Theo như Linux, nhưng hoạt động tốt trên hầu hết Linuxdom, điều này dường như có thể ở dạng nhị phân, bằng chứng là có nhiều trình cài đặt nhị phân loại "cho Linux (chung)" mà bạn sẽ thấy từ một số nhà cung cấp. Một số trò chuyện, trình duyệt, trò chơi, trình cài đặt meta, v.v ... được xuất bản theo cách này, nhưng luôn luôn bởi các nhà cung cấp lớn, những người có thể dành thời gian để làm điều này đúng. Thật tuyệt vời khi họ có thể nói "cho Linux" và nói chung là tự tin rằng nó sẽ hoạt động, nhưng điều này dường như là trường hợp.

Nhưng...

Tôi phân phối phần mềm của mình dưới dạng nguồn với tiện ích xây dựng. Tôi làm điều này bằng C, Erlang, Python, Guile, v.v. Điều này giúp tôi linh hoạt hơn rất nhiều về việc nó sẽ chạy hay không, và việc viết một bản dựng để đảm bảo những thứ phù hợp tồn tại trong thời gian xây dựng sẽ dễ dàng hơn nhiều so với đảm bảo mọi thứ được đặt đúng chỗ trong thời gian chạy. Khi tồn tại, việc viết một trình cập nhật tự động cho chương trình của bạn là chuyện nhỏ nếu bạn phân phối nguồn: nguồn thường nhỏ hơn rất nhiều so với tệp nhị phân bao gồm tất cả các dep và sự điên rồ khác. Sử dụng phương pháp này, tôi không gặp nhiều khó khăn khi triển khai trên Unices (và đôi khi là Windows, nhưng đó là một chút việc vặt).

Đủ trò chơi trẻ con, tự mình vũ trang!

Khi bạn trở nên nghiêm túc, như srsly srs, về việc hòa nhập trơn tru trong thế giới Linux, bạn phân phối các nguồn C hoặc chuyển sang một môi trường được quản lý hoàn chỉnh để có một ngôn ngữ thú vị đã được dựng sẵn. Ví dụ: nếu bạn đang viết mã Python, bạn có thể kiểm tra các phiên bản và biết phiên bản CPython nào của bạn hoạt động và thường mong đợi một phiên bản tương thích tồn tại trên một Linux cụ thể (và điều này dễ kiểm tra hơn nhiều so với quét C libs rộng rãi / phiên bản bạn có thể đang sử dụng). Erlang, Guile, Python, Perl, CL, v.v ... đều rất các mục tiêu dễ dàng cho loại triển khai này và nhiều trong số chúng có kho lưu trữ trung tâm như CPAN hoặc pip (hoặc bất cứ thứ gì) nơi người dùng có thể chạy lệnh để tự lấy nguồn đã ký khi họ muốn và biết rằng mọi thứ sẽ hoạt động như bạn dự định .

[Phụ lục: 1. Ngay cả Haskell thường có thể thực hiện việc này thông qua Cabal - mặc dù tôi sẽ thận trọng khi làm điều đó trong môi trường sản xuất. 2. Có các chiến lược triển khai "phát hành" hoàn toàn khác nhau với Erlang để đảm bảo mã của bạn mang một môi trường hoàn chỉnh xung quanh nó. 3. Python tiến thêm một bước với môi trường ảo; không phải tất cả thời gian làm việc đều giúp bạn nhiều như vậy.]

Điều cuối cùng về môi trường được quản lý trên Linux thật tuyệt vời . Và, như một phần thưởng, nó cho phép bạn xác định các phụ thuộc chung hơn nhiều, để chúng tự động giải quyết mà không cần nỗ lực thêm, không yêu cầu viết gói cho mỗi bản phân phối và bạn có thể ngừng quan tâm xem hệ thống là 32 hay 64 bit (nói chung, dù sao).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.