2011-11-18 30 views
10

Trên Mac OS X, tệp thi hành nhị phân ở định dạng DYLD chứa "lệnh trình tải" hướng dẫn hệ thống tải thư viện cách xử lý nội dung của tệp. Cụ thể, lệnh bộ nạp hướng dẫn hệ thống nơi các thư viện phụ thuộc nên được tìm kiếm, v.v.Làm cách nào để cài đặt lệnh trình tải DYLD không được hỗ trợ rõ ràng bởi ld?

Bạn có thể xem danh sách đầy đủ các lệnh bộ nạp cho bất kỳ nhị phân nào trên hệ thống của bạn bằng cách chạy "otool -l/path/to/your/app ".

Nói chung, các lệnh trình tải này được đặt bởi công cụ "ld" trong giai đoạn liên kết của quá trình biên dịch của dự án.

Câu hỏi của tôi là, tôi cần phải làm gì để thêm lệnh bộ nạp cho các loại được công khai không được hỗ trợ (rõ ràng) bởi ld? Cụ thể, tôi muốn tận dụng lợi thế của trình nạp bộ nạp LC_DYLD_ENVIRONMENT, có thể được sử dụng để chỉ định một chuỗi trong bảng lệnh bộ nạp của một tệp nhị phân cần được tải và được đánh giá là cài đặt biến môi trường trong ngữ cảnh của thực thi.

Tôi không thấy bất kỳ đối số nào để ld có thể tạo điều kiện thuận lợi cho việc này. Một cái gì đó như "-sectcreate" nhưng để cụ thể thêm vào nội dung của các lệnh loader, là những gì tôi sau.

Tôi biết điều này là có thể vì ít nhất một ứng dụng chuẩn trên Mac OS X sử dụng nó: Safari. Nhưng tôi không biết liệu họ có đạt được điều này bằng một số loại massage sau liên kết nhị phân hay không, nếu họ đang sử dụng phiên bản tùy chỉnh của ld để biết cách xây dựng và chuỗi lệnh trình tải tùy chỉnh trong hoặc nếu họ đang khai thác một tính năng tổng quát của lệnh ld mà tôi chưa thể tìm ra.

Trả lời

14

Dường như bạn có thể sử dụng -dyld_env, như sau: "-dyld_env DYLD_FRAMEWORK_PATH = /". Đây không phải là tài liệu trong trang người đàn ông, nhưng có thể được tìm thấy trong Options.cpp của ld64 và được đề cập trong tệp Changelog. Nếu bạn đang cố gắng làm điều đó từ Xcode, có thể bạn sẽ phải làm như sau: "-Xlinker -dyld_env -Xlinker DYLD_FRAMEWORK_PATH = /".

Một điều cần lưu ý: nếu bạn nhìn vào dyld.cpp của dyld, bạn sẽ thấy rằng nó chỉ cho phép các biến môi trường bắt đầu bằng DYLD_ và kết thúc bằng _PATH.

+0

Tuyệt vời! Cảm ơn. Tôi cũng đã nhận được một số phản hồi thông qua Twitter đã chỉ ra rằng LC_DYLD_ENVIRONMENT không thực sự cho phép bạn xác định các biến môi trường tùy ý, chỉ những biến có ảnh hưởng đến tải DYLD. Vì vậy, đến mức độ đề xuất LSEnvironment từ Ned dưới đây là phù hợp hơn cho các nhu cầu trước mắt của tôi, nhưng câu trả lời của bạn là tài liệu tham khảo thích hợp nhất cho ý chính của câu hỏi. – danielpunkass

8

Nếu tệp thi hành của bạn được cấu trúc như một phần của gói ứng dụng OS X tiêu chuẩn (ví dụ: .app có thể được khởi chạy bởi người dùng), cách thông thường để chỉ định biến môi trường cụ thể của ứng dụng là thông qua tệp plist bằng khóa LSEnvironment . Xem here để biết thêm thông tin.

+0

Cảm ơn, Ned! Đây không phải là câu trả lời chính xác cho câu hỏi như được đặt ra, nhưng quả thực nó là tâm điểm của sự quan tâm hiện tại của tôi trong tính năng lệnh trình nạp DYLD. Tôi sẽ sử dụng LSEnvironment cho các mục đích được mô tả! – danielpunkass

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