1) Tôi không biết tại sao tôi cần điều này cho một chức năng. Có thể ai đó khác có thể bước vào.
2) Trình liên kết xác định điều này bằng cách duyệt qua tất cả các tệp đối tượng và kiểm tra các ký hiệu bên trong từng tệp đối tượng. Tôi cho rằng tùy thuộc vào mối liên kết của bạn, thứ tự tìm kiếm chính xác có thể thay đổi.
Đối với tất cả các tệp và thư viện của đối tượng GNU binutils xuất hiện trong dòng lệnh của trình liên kết sau khi đối tượng chứa biểu tượng bị thiếu được tìm kiếm từ trái sang phải và biểu tượng đầu tiên được chọn.
Ví dụ 1:
- áo - sử dụng foo(), bar()
- Liba - cung cấp thanh()
- libb - cung cấp foo()
$> ld ao -la -lb
sẽ cho kết quả tìm kiếm các ký hiệu không xác định. Sau đó ld sẽ đi qua các libs từ trái sang phải để tìm kiếm các ký hiệu này và sẽ tìm thấy thanh trong liba và foo trong libb.
này có thể dẫn đến các vấn đề lạ khi phụ thuộc vòng tròn:
Ví dụ 2:
- a.o - sử dụng thanh()
- Liba - cung cấp thanh(), sử dụng foo()
- libb - cung cấp foo(), sử dụng thanh()
Bây giờ, có một phụ thuộc vòng tròn giữa Liba và libb và liên kết sẽ thất bại:
$> ld ao-la -lb
bởi vì khi tìm kiếm thông qua những biểu tượng không xác định trong libb, ld sẽ xác định rằng không có khác lib bên phải - lb cung cấp biểu tượng này. Điều này có thể được cố định trong ít nhất hai cách:
1) liên kết Liba hai lần: $> ld ao-la-la -lb
2) sử dụng tính năng nhóm ld của $> ld ao --start- group -la -lb --end-group
Trong trường hợp 2), nhóm sẽ thông báo cho ld tìm kiếm tất cả các ký hiệu trong tất cả các lib thuộc nhóm này.
Điều này có nghĩa là bạn có thể gọi một hàm mô-đun nội bộ (giả sử nguồn không có sẵn) nếu bạn biết chữ ký của hàm? – user199421
Nếu các chức năng có liên kết bên ngoài, thì có.Tuy nhiên, bạn sẽ không thể gọi các hàm được khai báo trong một không gian tên chưa được đặt tên hoặc được khai báo tĩnh (trừ khi bạn biết trình biên dịch/trình liên kết của bạn mang tên như thế nào). –