Điểm:12

Tại sao nhị phân được xây dựng 21.10 không tương thích với cài đặt 21.04?

lá cờ cn

Tôi không hiểu tại sao nhị phân được xây dựng vào ngày 21.10 không tương thích với hệ thống 21.04.

Nhị phân được liên kết với libc.so.6 cũng có sẵn trên phiên bản HĐH 21.04.

Cùng một nhị phân, trên hệ thống 21.10:

$ ldd turboledzd
    linux-vdso.so.1 (0x00007ffdc2595000)
    libhidapi-hidraw.so.0 => /lib/x86_64-linux-gnu/libhidapi-hidraw.so.0 (0x00007fdd64057000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd63e2f000)
    libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007fdd63e06000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fdd64085000)

Và trên hệ thống 21.04:

$ ldd turboledzd 
./turboledzd: /lib/x86_64-linux-gnu/libc.so.6: không tìm thấy phiên bản `GLIBC_2.34' (do ./turboledzd yêu cầu)
    linux-vdso.so.1 (0x00007fff9c570000)
    libhidapi-hidraw.so.0 => /lib/x86_64-linux-gnu/libhidapi-hidraw.so.0 (0x00007f37ec402000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f37ec216000)
    libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f37ec1ed000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f37ec423000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f37ec1cb000)

Câu hỏi của tôi:

Nếu libc.so.6 từ 21.04 không tương thích với libc.so.6 từ ngày 21.10, sau đó tại sao libc ngày 21.10 không được gọi libc.so.7 thay thế?

Hay tốt hơn, tại sao nó không được liên kết với một thứ gọi là libglibc.so.2.34 - nếu đó là một sự phụ thuộc?

N0rbert avatar
lá cờ zw
Sử dụng 20.04 LTS nếu bạn muốn có được thời gian sử dụng lâu dài mà không gặp rắc rối cho ứng dụng của mình.
marcelm avatar
lá cờ cn
_"Hoặc, tốt hơn, tại sao nó không được liên kết với thứ gọi là libglibc.so.2.34"_ - Bạn nghĩ điều đó sẽ giúp ích như thế nào? Trong cả hai trường hợp, chương trình sẽ không chạy cho đến khi bạn cài đặt một glibc cập nhật.
lá cờ cn
tl;dr: Vâng, đó là một mớ hỗn độn ngu ngốc. Nếu không thì đó không phải là Linux. Để so sánh, hãy tưởng tượng sẽ ngu ngốc như thế nào nếu một chương trình bạn đã biên dịch trên Windows 10 20H2 không chạy trên Windows 10 20H1.
lá cờ cn
@ user541686: Nó không dành riêng cho Linux; đó là kết quả của di sản AT&T được chia sẻ của Unix và Linux.Cụ thể, `libc` được coi là một phần của HĐH. Trên Windows, `MSVCRT*.DLL` là một phần của Visual Studio, không phải Windows và nhiều phiên bản có thể cùng tồn tại. Các trình biên dịch khác cho Windows có thể gửi các thư viện của riêng chúng theo cách tương tự. Bản thân API Windows được tạo phiên bản mạnh mẽ trong SDK của nó và đã có ít nhất kể từ Windows 95.
Điểm:25
lá cờ us

Nếu libc.so.6 từ 21.04 không tương thích với libc.so.6 từ ngày 21.10, sau đó tại sao libc ngày 21.10 không được gọi libc.so.7 thay thế?

libc.so là cốt lõi của một thư viện khi họ đến. Gần như mọi thứ đều phụ thuộc vào nó. Một trong những mục tiêu của glibc là cung cấp khả năng tương thích ngược - một chương trình có thể chạy với phiên bản cũ hơn libc.so.6 nên (thường) cũng hoạt động tốt với bản phát hành mới hơn. Tuy nhiên, nếu bạn chạm vào soname để libc.so.7 chỉ bởi vì bạn đã thêm một số chức năng mới, sau đó tất cả các trong số các chương trình đã xây dựng trước đó này sẽ cần được xây dựng lại mà không có lý do chính đáng. chưa có một thực sự lớn lao phá vỡ API cho glibc để đảm bảo điều này.

Tôi không hiểu tại sao nhị phân được xây dựng vào ngày 21.10 không tương thích với hệ thống 21.04.

Tôi không thấy ai đảm bảo chuyển tiếp khả năng tương thích (đó là những gì bạn mong đợi vào ngày 21.04 để có thể chạy thứ gì đó từ ngày 21.10) - tại sao bạn lại mong đợi điều đó nếu bạn không thực hiện các biện pháp phòng ngừa để đảm bảo điều đó?

lá cờ st
Glibc đã có ở thư viện phiên bản 6 kể từ khi tôi làm Linux, nếu tôi nhớ không nhầm.
muru avatar
lá cờ us
Có vẻ như kể từ [năm 1997, khi quá trình phân tách libc/glibc của Linux kết thúc](https://man7.org/linux/man-pages/man7/glibc.7.html).
Bram avatar
lá cờ cn
Vì vậy, đừng bao giờ xây dựng bất cứ thứ gì trên một hệ thống mới, nếu bạn muốn phân phối nhị phân? Làm cách nào tôi có thể sử dụng HĐH mới để tạo các tệp nhị phân chạy trên các HĐH cũ hơn?
Incomputable avatar
lá cờ cn
@Bram bạn có thể gắn bó với bộ tính năng mà thư viện lâu đời nhất trong hệ điều hành phân phối của bạn cung cấp.
Bram avatar
lá cờ cn
@Incomputable Tôi không sử dụng bất kỳ tính năng mới nào. Tôi chỉ sử dụng một hệ điều hành mới để biên dịch.
Guntram Blohm avatar
lá cờ cn
Đây là lý do tại sao tôi giữ một máy ảo Fedora 12 hơn 10 năm tuổi (cũng có thể là Ubuntu 10.04, nhưng tôi chỉ chuyển sang Ubuntu với 14.04); bất kỳ công cụ nhỏ nào tôi tạo cho mục đích sử dụng của riêng mình đều được biên dịch ở đó và hoạt động trên mọi máy tôi sao chép nó vào, bất kể nó cũ hay mới.
Ruslan avatar
lá cờ bv
@Bram vâng, chỉ cần không biên dịch nó trên hệ thống mới hơn mục tiêu cũ nhất của bạn và cũng không sử dụng GCC mới hơn mục tiêu đó hỗ trợ, ít nhất là đối với mã C++, vì `libstdc++.so` sẽ có cùng một vấn đề .
Ruslan avatar
lá cờ bv
@Incomputable không dễ dàng với glibc/libstdC++, bởi vì khi liên kết, bạn tự động sử dụng ABI mới nhất mà các thư viện này hỗ trợ, chẳng hạn như `GLIBC_2.34` trong OP và điều này được yêu cầu bởi tệp nhị phân cuối cùng để có mặt trong thư viện mà nó tải lúc khởi động. Có thể có một số phép thuật liên kết để làm khác, nhưng tôi không biết về nó.
lá cờ cn
@Bram "Làm cách nào tôi có thể sử dụng HĐH mới để tạo nhị phân" - docker giúp ích rất nhiều trong các tình huống như thế này. Bạn có thể sử dụng hình ảnh `ubuntu:20.04` chẳng hạn, ánh xạ thư mục nguồn của bạn bên trong nó và xây dựng các tệp nhị phân ở đó. Giúp bạn tiết kiệm cài đặt một glibc/biên dịch chéo riêng biệt.
lá cờ cn
@viraptor Sẽ rất hữu ích khi giải thích những gì người ta có thể làm nếu không có Docker. Vấn đề này đã cũ, nhưng Docker chỉ mới xuất hiện vào năm 2013.
lá cờ cn
@ user541686 nếu không có nó thì câu trả lời thật khó và quá dài cho các bình luận. "Google để tìm hiểu về cách cài đặt nhiều bộ công cụ và biên dịch chéo" là con trỏ ngắn nhất.
capr avatar
lá cờ cn
Những người dùng Linux không thể hiểu tại sao mọi người lại muốn xây dựng một tệp nhị phân hoạt động trên một hệ thống cũ hơn. Và họ đã có _thập kỷ_ để hiểu những điều đơn giản như thế mà họ vẫn không hiểu.
muru avatar
lá cờ us
@capr và điều gì ngăn cản bạn làm như vậy?
capr avatar
lá cờ cn
"Tính năng" của các biểu tượng được phiên bản của @muru glibc và gcc thiếu tùy chọn tương thích "phiên bản tối thiểu" (như OSX có).
muru avatar
lá cờ us
@capr ah, nhưng việc xây dựng cho các phiên bản cũ hơn là một vấn đề đã được giải quyết - thậm chí 7-8 năm trước khi tôi tìm hiểu về đóng gói, pbuilder và những thứ tương tự đã là một quy trình công việc trưởng thành. Ngày nay với Docker, điều đó thậm chí còn dễ dàng hơn. Tôi không phải là người dùng macOS, vì vậy tôi không biết liệu macOS có tương đương với *những* đó không.
capr avatar
lá cờ cn
@muru thực tế là bạn đang khuyên tôi nên xây dựng bằng Docker, do đó vẫn còn trên Linux cũ hơn mà bây giờ nó ở trong VM cho thấy chính xác sự thiếu hiểu biết về vấn đề mà tôi đang nói đến. Trên Linux cũ hơn, bạn có một gcc cũ! Đó không phải là điều bạn muốn chút nào. Đó chỉ là một hack. Nó trái ngược với kỹ thuật.
muru avatar
lá cờ us
@capr eh, với Docker, bạn cũng có thể dễ dàng tạo một hình ảnh bằng glibc cũ và GCC mới của mình. Tất cả những gì tôi thấy ở đây là sự thiếu quan tâm đến việc sử dụng các giải pháp nổi tiếng, được hiểu rõ và thay vào đó chỉ than vãn khi mọi thứ không như $MY_FAVOURITE_OS
capr avatar
lá cờ cn
@muru vì vậy để quay lại câu hỏi ban đầu của bạn, điều "ngăn" tôi làm như vậy là không muốn kết hợp một máy ảo và xây dựng toàn bộ chuỗi công cụ biên dịch, và nếu không làm được điều đó, tôi đã "rên rỉ", hiểu rồi.
Điểm:13
lá cờ us

Dựa theo gói.ubuntu.com, 21.04 sử dụng glibc 2.33, trong khi 21.10 sử dụng glibc 2.34, không hoàn toàn tương thích.

Tuy nhiên, bạn sẽ có thể xây dựng các tệp nhị phân cho Ubuntu 21.04 từ mã nguồn.

Trừ khi nguồn được giải thích, bạn thường cần xây dựng các gói nhị phân riêng biệt cho các phiên bản Ubuntu khác nhau. Bệ phóng có thể tự động hóa điều đó cho bạn.

tại sao libc vào ngày 21.10 không được gọi là libc.so.7?

Đó là quyết định mà chỉ những nhà phát triển của glibc mới có thể đưa ra.

lá cờ cn
Tôi đoán đó là một quyết định mà nhà phân phối có thể đưa ra - nhưng nó có thể sẽ gây ra nhiều nhầm lẫn và không tương thích hơn là nó sẽ giải quyết được.... Và nếu bạn thực sự muốn một hệ thống có nhiều phiên bản glibc, có lẽ bạn cần phải có phiên bản ld -linux.so... cần được phản ánh trong các tệp nhị phân cho một hệ thống như vậy, khiến chúng không tương thích với hầu hết mọi thứ khác...
Điểm:2
lá cờ ph

Thuật ngữ để tìm kiếm trên google là "phiên bản biểu tượng glibc".

Như giới thiệu này giải thích, glibc chứa nhiều phiên bản của mỗi biểu tượng đã thay đổi theo thời gian, v.v. libc.so.6 chứa tất cả các phiên bản glibc từ 2.0 cho đến bất kỳ phiên bản nào mà nó nói.

Khi bạn liên kết một thư viện hoặc tệp nhị phân mới với nó, bạn đang sử dụng .h tệp và biểu tượng đã xuất cho các phiên bản mới nhất của biểu tượng.

Đối với việc truy cập các biểu tượng cũ hơn, có một câu hỏi trên StackOverflow có tên Làm cách nào tôi có thể liên kết đến một phiên bản glibc cụ thể?, nhưng vì tất cả các phần phụ thuộc khác của bạn cũng có khả năng liên kết với các biểu tượng mới nhất, nên việc chỉ sử dụng Docker hoặc chroot để nhắm mục tiêu các phiên bản hệ thống cũ hơn sẽ dễ dàng hơn nhiều vì bạn có thể sẽ phải xây dựng lại từ đầu nếu không.

Các nhà phát triển Python thực sự duy trì các thùng chứa Docker có tên nhiềulinux... đặc biệt để thiết lập đường cơ sở đáng tin cậy để xây dựng bánh xe (gói nhị phân có thể phân phối lại) cho gói Python có thành phần được biên dịch.

Tôi tin rằng cách tiếp cận của Windows gần hơn với việc gộp nhiều cấu hình được xác định rõ ràng và thúc giục tất cả tác giả của các thư viện được biên dịch trước cung cấp các bản dựng nhắm mục tiêu đến các cấu hình cũ hơn. (Với lời cảnh báo rằng bạn phải giả định rằng những thứ đó phải thì là ở miễn phíd bởi cùng một đơn vị biên dịch đó malloc'Đó là bởi vì PE không có các ký hiệu chung và các thư viện khác nhau có thể phụ thuộc vào các phiên bản khác nhau của trình cấp phát của riêng chúng tĩnh các biến và sự khác biệt về ngữ nghĩa.)

lá cờ cn
**Windows** thực sự có nhiều cấu hình được xác định rõ ràng và vẫn ghi lại chúng cho NT 4.0: https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt . Nhưng nó không thừa nhận bất cứ điều gì về `malloc/free`; đó không phải là chức năng của Windows. Windows sử dụng `HeapAlloc`/`HeapFree` và nó chỉ yêu cầu bạn sử dụng cùng một đống cho cả hai.
lá cờ ph
@MSalters Bất kể bạn đang sử dụng API Win32 hay API POSIX, quan điểm của tôi là tài liệu Microsoft mà tôi đã đọc có thái độ rất "Nếu nó bị hỏng, bạn phải giữ lại các phần" đối với việc phân bổ và giải phóng một tạo phẩm xây dựng ở nơi khác... đừng yêu cầu tôi tìm lại nó. Đó là thời đại WinXP và Microsoft đã cải tổ lại các URL của họ và đổi chủ đề MSDN kể từ đó.
lá cờ cn
Tài liệu của Microsoft về MSVC có những cảnh báo đó - tất nhiên, trình biên dịch thực hiện `malloc`.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.