Câu hỏi của tôi:Chức năng bình đẳng con trỏ trong C
- là chức năng bình đẳng con trỏ được bảo đảm theo tiêu chuẩn C?
- Nếu câu trả lời của (1) là có. Đó có phải là trường hợp bất kể con trỏ có được trong các đơn vị biên dịch cuối cùng khác nhau hay không (ví dụ: tệp thực thi chính và thư viện được chia sẻ)?
- Trình tải động xử lý như thế nào? (Tôi có thể suy nghĩ về một vài lý do mà điều này có thể phức tạp, tất cả liên quan đến mã PIC (ví dụ: các bảng GOT trong elf và bất kỳ COFF nào tương đương sử dụng cho điều đó)). Bất kể (1) và (2) trình tải linux dường như đảm bảo điều này.
Dưới đây là ví dụ. Các câu hỏi trên đun sôi cho dù C đảm bảo những gì main.c
in: "Function equality: 1"
hoặc "Function equality: 0"
và, trong trường hợp đầu tiên, trình tải động làm cho điều đó xảy ra như thế nào.
common.h:
extern void * getc_main;
extern void * getc_shared;
void assign_getc_shared();
main.c:
#include <stdio.h>
#include "common.h"
int main()
{
getc_main = (void*) getc;
assign_getc_shared();
printf("Function equality: %d\n", getc_main == getc_shared);
return 0;
}
shared.c:
#include <stdio.h>
#include "common.h"
void assign_getc_shared()
{
getc_shared = (void*) getc;
}
Trong Unix này sẽ được biên dịch với các lệnh sau:
cc -shared -fPIC -o libshared.so shared.c
cc -o main main.c -L. -lshared
Và thực hiện với:
LD_LIBRARY_PATH=. ./main
Đó là một cách khá dài để hỏi "là nó đảm bảo rằng các chức năng thư viện chuẩn chỉ được bao gồm một lần trong thực thi" –
Và tôi nghĩ câu trả lời cho câu hỏi của ông Lister là "Không, nó không được bảo đảm" .Ví dụ: hàm có thể được gạch chân và nếu bạn lấy địa chỉ của hàm nội tuyến, hàm này sẽ được bao gồm dưới dạng hàm "thực" trong mã, có nghĩa là sẽ có nhiều chức năng cho cùng một hàm nguồn. –
@MrLister Nếu tôi chỉ muốn biết điều đó, thì tôi sẽ chỉ hỏi điều đó. Lý do đặt câu hỏi phụ là vì tôi quan tâm đến việc biết chi tiết về cách trình tải động tương tác với vấn đề này. Từ bình luận của bạn tôi đoán bạn không, và đó là tốt. – fons