मेरे सवालों का:समारोह सूचक समानता
- समारोह सूचक समानता सी मानक की गारंटी है?
- यदि (1) का उत्तर हाँ है। क्या यह मामला अलग-अलग अंतिम संकलन इकाइयों (जैसे मुख्य निष्पादन योग्य और साझा लाइब्रेरी) में प्राप्त किया जा रहा है?
- गतिशील लोडर उस के साथ कैसे व्यवहार करता है? (मैं कुछ कारणों के बारे में सोच सकता हूं जिनके लिए यह मुश्किल हो सकता है, सभी पीआईसी कोड से संबंधित हैं (उदाहरण के लिए एएलएफ में जीओटी टेबल और इसके लिए जो भी समकक्ष सीओएफएफ उपयोग करता है))। भले ही (1) और (2) लिनक्स लोडर इसकी गारंटी देता है।
यहां एक उदाहरण है। ऊपर दिए गए प्रश्न यह बताते हैं कि सी main.c
प्रिंट्स की गारंटी देता है: "Function equality: 1"
या "Function equality: 0"
और, पहले मामले में, डायनामिक लोडर ऐसा कैसे करता है।
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;
}
यूनिक्स में यह निम्न कमांड के साथ संकलित किया जाएगा:
cc -shared -fPIC -o libshared.so shared.c
cc -o main main.c -L. -lshared
और साथ निष्पादित:
LD_LIBRARY_PATH=. ./main
यह पूछने का एक लंबा रास्ता है "क्या यह गारंटी है कि मानक लाइब्रेरी फ़ंक्शंस केवल निष्पादन योग्य में एक बार शामिल हो जाएंगे" –
और मुझे लगता है कि श्री लिस्टर के प्रश्न का उत्तर "नहीं, इसकी गारंटी नहीं है" ।कार्यों को रेखांकित किया जा सकता है, उदाहरण के लिए - और यदि आप इनलाइन फ़ंक्शन का पता लेते हैं, तो इसे कोड में "असली" फ़ंक्शन के रूप में शामिल किया जाएगा, जिसका अर्थ है कि संभावित स्रोत फ़ंक्शन के लिए संभावित रूप से कई फ़ंक्शन होंगे। –
@Mrlister अगर मुझे केवल यह जानने में दिलचस्पी थी, तो मैंने केवल यही पूछा होगा। अतिरिक्त प्रश्न पूछने का कारण यह है कि मुझे इस समस्या से निपटने के तरीके के बारे में जानकारी जानने में दिलचस्पी है। आपकी टिप्पणी से मुझे लगता है कि आप नहीं हैं, और यह ठीक है। – fons