2015-11-26 14 views
6

Tôi biết cách thay thế malloc bằng LD_PRELOAD; thư viện được tải trước được ưu tiên, vì vậy nếu chúng tôi tải trước jemalloc, tệp thực thi có phiên bản malloc. Tuy nhiên, khi chúng tôi xây dựng ứng dụng với -ljemalloc, chúng tôi cũng liên kết nó với glibc. Làm thế nào Linux biết rằng nó phải sử dụng jemallocmalloc và không phải glibc một? Nếu tôi sẽ liên kết cả hai jemalloctcmalloc, chúng tôi sẽ có 3 malloc ngay bây giờ, điều gì và tại sao Linux (hoặc có thể là trình liên kết, tôi không chắc chắn) sẽ chọn?Làm thế nào Linux quyết định `malloc` để sử dụng?

+1

Người đầu tiên thấy. Bây giờ để hiểu được thứ tự nó trông như thế nào ;-) –

+0

Bạn có bao gồm 'glibc' trong định nghĩa của linux không? Hoặc 'ld.so'? Linux có thể được định nghĩa mờ theo thời gian. – MSalters

+0

Vâng, về định nghĩa của Linux trong câu hỏi này, thực sự nó có nghĩa là: lựa chọn thư viện được thực hiện tại thời gian liên kết (bởi linker) hoặc tại thời gian chạy (bởi "Linux"); ví dụ, nếu 'libjemalloc' vắng mặt, phần mềm sẽ tự động hạ cấp xuống một triển khai' malloc' khác trong một 'so' khác được liên kết với phần mềm không? – Vitaliy

Trả lời

2

Bạn có thể kiểm tra thứ tự các thư viện được nạp bởi chạy:

strace -ff -s 999 YOUR_BINARY 2>&1 | grep -e 'library1' -e 'library2'

Trình tự phải phù hợp với sản lượng từ ldd YOUR_BINARY.

Và có, như đã lưu ý, thư viện đầu tiên sẽ được ưu tiên.

1

Điều đó thật thú vị. Một số hệ điều hành cảnh báo bạn về các biểu tượng được sao chép tại thời gian liên kết (AIX, IIRC). Linux thì không.

Điều gì đó tương tự xảy ra khi thiết bị ứng dụng MPI thông qua giao diện PMPI. Trong trường hợp này, thứ tự là quan trọng. Nếu công cụ thiết bị đo đạc xuất hiện sau thư viện MPI, thì việc xen kẽ không hoạt động. Vì vậy, tôi nghĩ rằng trong trường hợp của bạn sẽ giống nhau. Trình liên kết sẽ chọn theo thứ tự đã cho của họ.

+0

Một số * liên kết * sẽ cảnh báo bạn. Nó không liên quan gì đến hệ điều hành. – EJP

+0

Ah! Tôi luôn luôn liên quan đến mối liên kết với hệ điều hành nhưng, tất nhiên, chúng tôi có thể có những người liên kết khác nhau. Cảm ơn bạn đã làm rõ. – Harald

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