2013-06-10 31 views
9

Tôi đang cố gắng triển khai thuật toán quản lý bộ nhớ đầu tiên phù hợp đơn giản. Vì vậy, tôi đã có một tập tin C với của riêng tôiTại sao tôi không gặp lỗi liên kết khi tôi cung cấp malloc của riêng mình và miễn phí?

void* malloc(size_t) 

void free(void*) 

Khi tạo một file .out với gcc, Tôi đang mong đợi một lỗi liên kết bởi vì nó sẽ mâu thuẫn với tiêu chuẩn hiện hành thực hiện. Nhưng tập tin của tôi liên kết tốt.

Hãy giúp tôi hiểu.

+0

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. –

+3

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

+4

@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. –

Trả lời

5

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 mallocfree 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 callocmemalignposix_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ổ.

1

Theo kinh nghiệm của tôi, đó là thực hành tiêu chuẩn cho mallocs tùy chỉnh và giải phóng được đặt tên duy nhất, chẳng hạn như hạt nhân malloc, kmalloc và hạt nhân miễn phí, kfree. Nếu bạn đang viết cho riêng mình, tôi khuyên bạn nên đặt tên riêng cho các chức năng của mình.

Bạn định phân bổ bộ nhớ như thế nào? Hầu hết thời gian bạn nên quấn quanh hàm malloc để cung cấp chức năng tùy chỉnh, nhưng vẫn kết thúc bằng cách sử dụng malloc ở dạng này hoặc dạng khác. Theo tôi, đây là con đường bạn nên đi, vì vậy tôi sẽ không quá vội vàng để vứt bỏ các chức năng được xây dựng trong malloc và miễn phí trừ khi bạn có lý do chính đáng (hoặc mong muốn mạnh mẽ) để làm như vậy. Việc đặt tên chúng giống nhau sẽ ảnh hưởng đến điều này.

This is the Minix implementation of malloc, chỉ để cho bạn cảm nhận về những gì bạn đang xem.

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