Có cách nào nguồn mở để tạo tĩnh từ một tệp thực thi động không có sẵn mã nguồn không?


20

Hãy để tôi giải thích vấn đề với một ví dụ. Tôi sử dụng một số chương trình cũ trong công việc hàng ngày của mình, ví dụ như xfigpdfedit .

Bây giờ, các chương trình này khá cũ và không được cập nhật quá thường xuyên; nỗi sợ của tôi là một ngày nào đó họ sẽ không làm việc nữa vì thiếu một số thư viện hoặc một số cập nhật không tương thích.

Nếu bây giờ chương trình dễ dàng biên dịch , trên một hệ thống đang chạy, giải pháp rất hữu ích: hãy thử hack một chút nguồn và biên dịch tĩnh --- kết quả thực thi sẽ lớn và không hiệu quả, nhưng nó sẽ hoạt động cho tương lai gần (1). Đây có vẻ là trường hợp xfigvà tôi sẽ thử nó càng sớm càng tốt.

Nhưng, ví dụ, pdfeditphụ thuộc vào Qt3 và thiết lập một hệ thống để biên dịch nó khá phức tạp tại thời điểm này. May mắn thay, nó có thể được chạy ngay bây giờ, nhờ thực tế là thư viện mà nó cần không xung đột với bất cứ điều gì. Nhưng điều này có thể thay đổi trong tương lai, vì vậy tôi muốn giải quyết vấn đề này:

Làm cách nào tôi có thể tạo nhị phân tĩnh (hoặc vật tương tự) nếu tôi có một thư viện động và tất cả các thư viện, nhưng không có mã nguồn, trên Ubuntu?

Tôi tìm kiếm xung quanh. Một khả năng là statifier (2), nhưng nó có rất nhiều vấn đề với việc ngẫu nhiên địa chỉ , vì vậy nó là không. Phiên bản không miễn phí, Ermine , dường như hoạt động, nhưng tôi thực sự thích một tùy chọn nguồn mở.

Một khả năng khác là sử dụng docker hoặc một hệ thống đóng gói tương tự. Nhưng tất cả các hướng dẫn tôi tìm thấy là khá định hướng RedHat ; và, thành thật mà nói, khá phức tạp để làm theo.


Chú thích :

(1) không quá điên rồ. Tôi sử dụng một ffmpeg tĩnh chẳng hạn, hoạt động tốt và không có bất kỳ vấn đề tương thích nào ...

(2) để biên dịch statifier, xem /programming/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-firth-error

Câu trả lời:


19

Bạn có thể giải quyết vấn đề của mình theo một cách khác và đơn giản hơn:

Sử dụng lddtrên tệp thực thi của bạn để xem các thư viện được liên kết, ví dụ:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

Sau đó thu thập tất cả các thư viện trong một thư mục và đặt biến môi trường LD_LIBRARY_PATH trước khi chạy chương trình của bạn để trỏ đến thư mục này:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

Ngoài ra, bạn có thể thêm một mục cho thư mục lib vào /etc/ld.so.conf.d/. Nhưng điều đó sẽ áp dụng thay đổi trên toàn hệ thống.


Đây là một ý tưởng tốt --- mặc dù tôi thực sự muốn tìm cách đóng gói tất cả những thứ này thành một tệp thực thi; giải pháp này có thể bị ảnh hưởng bởi những thay đổi trong trình tải (mặc dù tôi hy vọng không ai sẽ làm điều đó theo cách không tương thích ngược). Sẽ thưởng tiền thưởng nếu không có giải pháp tốt hơn phát sinh --- cảm ơn.
Rmano

Vâng, bạn có thể thêm nó vào một tập lệnh cài đặt nhỏ và liên kết nó với đường dẫn cục bộ. Tôi thích giải pháp này, có thể đã sử dụng nó một thời gian trở lại.
WalyKu

1
@Klaus, linux-vdso.so.1 không thấy đâu cả, tôi cho rằng nó nằm trong kernel, đúng không?
Rmano

1
Vâng. Từ man 7 vdso: "" vDSO "(đối tượng chia sẻ động ảo) là một thư viện chia sẻ nhỏ mà hạt nhân tự động ánh xạ vào không gian địa chỉ của tất cả các ứng dụng không gian người dùng."
Klaus D.

Mặc dù đây không hoàn toàn là một câu trả lời cho câu hỏi, nhưng nó là một cách giải quyết hợp lý. Cảm ơn.
Rmano

2

Một đề nghị liên quan đến statifier :

Nếu ngẫu nhiên bố trí không gian địa chỉ (ASLR) khiến nó không thành công, bạn không phải tắt nó cho toàn bộ máy. Bạn có thể tắt nó chỉ cho quá trình đó:

$ setarch `uname -m` -R statified_pdfedit [args...]

Nó sẽ chạy lệnh đó với bố cục ngẫu nhiên bị vô hiệu hóa (không cần phải root).


Ồ, thật thú vị. Bây giờ nếu tôi có thể biên dịch statifier...
Rmano

Tổng hợp và kiểm tra. xfig_statifiedlõi vẫn còn ... một điều đáng tiếc. Dù sao cũng cảm ơn bạn.
Rmano

Vâng, thật đáng tiếc. Tôi đang tự hỏi nếu nó không phải là một vấn đề 64 bit, hãy thử chạy statifier trên thiết lập 32 bit?
lemonsqueeze

Đã kiểm tra trên máy 32 bit, vẫn còn các lõi.
Rmano
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.