Moje pytania:Funkcja równość wskaźnik w C
- Czy funkcja równość wskaźnik gwarantowana przez standard C?
- Jeśli odpowiedź (1) brzmi "tak". Czy tak jest, niezależnie od tego, jaki wskaźnik uzyskano w różnych końcowych jednostkach kompilacji (na przykład główny plik wykonywalny i biblioteka współdzielona)?
- Jak radzi sobie z tym ładowarka dynamiczna? (Mogę wymyślić kilka powodów, dla których może to być trudne, wszystkie związane z kodem PIC (np. Tabele GOT w elf i jakikolwiek równoważny COFF używa do tego)). Niezależnie od (1) i (2) program ładujący linuksa wydaje się to gwarantować.
Oto przykład. Powyższe pytania sprowadzają się do tego, czy C gwarantuje, co main.c
drukuje: "Function equality: 1"
lub "Function equality: 0"
oraz, w pierwszym przypadku, w jaki sposób ładuje się dynamiczny program ładujący.
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;
}
W Unix to będzie przygotowana z następujących poleceń:
cc -shared -fPIC -o libshared.so shared.c
cc -o main main.c -L. -lshared
i wykonane z:
LD_LIBRARY_PATH=. ./main
To dość długa droga, by zapytać "czy gwarantuje się, że standardowe funkcje biblioteczne zostaną uwzględnione tylko raz w pliku wykonywalnym" –
. I myślę, że odpowiedź na pytanie pana Listera brzmi: "Nie, to nie jest gwarantowane" .Funkcje mogą być na przykład wstawiane - i jeśli wybierzesz adres funkcji inline, zostanie ona włączona do kodu jako "rzeczywista" funkcja, co oznacza, że potencjalnie będzie wiele funkcji dla tej samej funkcji źródłowej. –
@MrLister Gdybym był zainteresowany, aby wiedzieć tylko to, wtedy bym to tylko poprosił. Powodem zadawania dodatkowych pytań jest to, że jestem zainteresowany poznaniem szczegółów, jak dynamiczny program ładujący radzi sobie z tym problemem. Z twojego komentarza chyba nie jesteś i to w porządku. – fons