Tôi đang gặp lỗi liên kết vì nó sẽ xung đột với triển khai chuẩn hiện có.
Kỳ vọng của bạn không đúng: hầu hết các triển khai libc UNIX đều hỗ trợ sử dụng một số malloc khác. Để kết thúc, họ đặt malloc
, realloc
, free
v.v ... vào một tệp đối tượng riêng biệt hoặc mỗi tệp vào một tệp đối tượng của riêng nó.
Trình liên kết sau đó được miễn phí để thay thế malloc.o
trong libc.a
với việc triển khai của bạn. Bạn có thể đọc về thuật toán mà trình liên kết sử dụng here. Khi bạn hiểu thuật toán, cần phải rõ ràng lý do tại sao liên kết malloc
và free
của riêng bạn không gây ra lỗi liên kết.
Thư viện chia sẻ UNIX được thiết kế rõ ràng để mô phỏng thư viện lưu trữ, vì vậy trong khi chi tiết lý do bạn không gặp lỗi liên kết khi liên kết với libc.so
khác nhau, tinh thần là như nhau.
Tuy nhiên, bạn chưa hoàn tất. Việc liên kết bất kỳ chương trình phức tạp vừa phải nào với việc triển khai của bạn có thể sẽ bị lỗi, vì khi bạn thay thế malloc
, bạn cũng cần triển khai realloc
và có khả năng calloc
và memalign
và posix_memalign
. Nếu không, bạn sẽ nhận được một hỗn hợp triển khai và khi ai đó vượt qua realloc
con trỏ đã chỉnh sửa đến free
của bạn, mọi thứ có thể sẽ phát nổ.
Nguồn
2013-06-17 00:51:20
Tôi nghĩ rằng nó được coi là thực hành chấp nhận được để "ghi đè" thói quen theo cách này bằng cách sử dụng thứ tự liên kết để không có lỗi/cảnh báo liên kết theo mặc định. –
Nó liên kết, nhưng nó thực sự chạy mã của bạn? GCC có nội trang malloc và miễn phí có thể ghi đè lên của bạn. – idoby
@IBY: điểm tốt - OP có thể cần '-fno-builtin' hoặc' -fno-builtin-malloc -fno-builtin-free' để đảm bảo rằng các thói quen của anh ta được gọi. –