El Capitan, thực hiện kiểm tra, DYLD_LIBRARY_PATH


9

Tôi phát triển các ứng dụng bằng cách sử dụng bộ công cụ Unix thông thường: trình biên dịch makevà thư viện dùng chung. Các thủ tục sau đó theo truyền thống là một cái gì đó như

  • ./configure, mà điều chỉnh các nguồn cho các tính năng của máy mà nó đang chạy,
  • make, trong đó thực sự biên dịch các lib được chia sẻ, thực thi, v.v.
  • make check, chạy thử nghiệm trước khi chúng tôi cài đặt gói,
  • make install, nếu gói hoạt động đúng, và cuối cùng, tùy chọn,
  • make installcheck, để đảm bảo cài đặt hoạt động.

Trong khi đó make, các lib và các tệp thực thi được chia sẻ được biên dịch ở dạng cuối cùng của chúng: các tệp thực thi được biên dịch với sự phụ thuộc vào các lib được chia sẻ ở đích cuối cùng của chúng (nghĩa là chúng phụ thuộc vào các thư viện /usr/local/libmặc dù chúng chưa ở đó, chúng vẫn còn trong bản dựng cây). Sau đó make install, đại khái, chỉ cần sử dụng cpđể cài đặt lib và thực thi từ cây xây dựng đến vị trí cuối cùng.

Trong make checkgiai đoạn này, chúng tôi đang chạy chương trình gỡ cài đặt: các tệp lib, tệp thực thi và tệp phụ trợ được chia sẻ vẫn còn trong cây xây dựng. Để chạy thử nghiệm, bạn phải thiết lập một vài biến môi trường tùy chỉnh (ví dụ để thông báo cho chương trình của bạn rằng các tệp dữ liệu phụ trợ của bạn không nằm /usr/local/sharetrong cây nguồn) và một số biến môi trường hệ thống, để báo cho trình tải chia sẻ lib của bạn xem cho các libs chia sẻ. Các biến môi trường trên unices truyền thống là LD_LIBRARY_PATH, trên OS X nó là DYLD_LIBRARY_PATH. Điều này đã làm việc trong (hàng chục) năm.

Nhưng bây giờ, El Capitan đã phá vỡ điều này.

$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$

bây giờ, khi SIP được kích hoạt, không DYLD_*được xuất từ ​​một quy trình cho con của nó.

Vì vậy, câu hỏi của tôi là: Làm thế nào chúng ta có thể chạy các chương trình không được cài đặt? Quy trình cần tuân thủ để có thể chạy chuỗi Unix truyền thống là ./configure && make && make checkgì?

Hãy , không có câu trả lời như "chạy make installđầu tiên". Đó không phải là vấn đề. Tôi là một nhà phát triển và chạy "make check" (và nói chung là chạy phiên bản chưa cài đặt của chương trình) là điều tôi thường xuyên làm. Ngay cả việc cài đặt đến một nơi giả cũng tốn thời gian. Tôi cần một cái gì đó hiệu quả, hiệu quả. Và việc vô hiệu hóa SIP sẽ không khắc phục được sự cố cho người dùng các gói của tôi muốn chạy make check.


Tôi vẫn có thể sử dụng DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6để chạy APU cũ (với thư viện cũ) dưới 10.11 (mặc dù biến không hiển thị trong env). Lạ (nhưng nó hoạt động).
nohillside

Câu trả lời:


6

Có vẻ như DYLD_ * chỉ bị loại bỏ đối với các nhị phân đã được bảo vệ của Bỉ (Tôi không chắc chính xác điều đó có nghĩa là gì, nhưng rõ ràng mọi thứ trong / bin và / usr / bin cho người mới bắt đầu) Tuy nhiên, nếu bạn sao chép / usr / bin / env đến một nơi khác, nó sẽ giữ các công cụ DYLD_ * của nó:

$ cp /usr/bin/env ~/Desktop; (DYLD_FOO=bar ~/Desktop/env)|grep DY
dyld: warning, unknown environment variable: DYLD_FOO
DYLD_FOO=bar

Tôi nghĩ make make luôn chạy các lệnh thông qua / bin / sh, vì vậy bạn không thể đặt các biến nguy hiểm của Wap trong tệp tạo tệp và để chúng ảnh hưởng đến các lệnh, nhưng có lẽ bạn có thể chuyển kiểm tra thành tập lệnh shell, đặt các biến môi trường bên trong kịch bản, và sau đó gọi kịch bản từ make. Mặc dù rõ ràng, điều này sẽ không giúp bạn nếu các bài kiểm tra, lần lượt, dựa vào các tập lệnh shell (hoặc nếu những thứ được kiểm tra tập lệnh shell!) Bởi vì sau đó chúng sẽ gọi / bin / sh và lại mất các biến .. .


Cảm ơn rất nhiều! Bây giờ tôi có thể cp /bin/sh, và sử dụng cái vỏ đó thay vì cái thật. Symlinks sẽ không làm được, và các liên kết cứng là "Hoạt động không được phép", vì vậy tôi đoán tôi phải sống cùng cp.
akim
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.