Jestem nowa w C, więc przepraszam za mój brak wiedzy (moja C-book tutaj jest naprawdę ogromna :)Rozszerzanie dynamicznie połączonej biblioteki współużytkowanej?
Chciałbym rozszerzyć biblioteki współdzielonej (libcustomer.so) z zamkniętego źródła, ale publiczne znany api.
Czy coś takiego jest możliwe?
- rename libcustomer.so do liboldcustomer.so
- utworzyć rozszerzoną libcustomer.so dzielone biblioteki (tak inni pośrednio korzystania z przedłużony jeden)
- odnośnik liboldcustomer.so na mój rozszerzony libcustomer.so poprzez -loldcustomer
- przekazania żadnych dodatkowych nie realizowanych metod bezpośrednio do starego „liboldcustomer.so”
nie sądzę, że to działa w ten sposób (nazwa jest kompilowany do .so, prawda?). Ale jaka jest alternatywa?
Dla # 4: czy istnieje ogólny sposób, aby to zrobić, czy muszę napisać metodę o nazwie takiej jak stara i przekazać dalej (jak?)?
Ponieważ oryginalny libcustomer.so (= liboldcustomer.so) może się zmieniać od czasu do czasu, wszystkie te rzeczy powinny działać dynamicznie.
Ze względów bezpieczeństwa, nasz system ma LD_PRELOAD (inaczej bym wziąć to :().
Pomyśl o Extended Validation kontrole & niektóre lepsze NPE-manipulacyjny.
Z góry dzięki za pomoc !
EDIT:
ja tylko wdrożenie mojego rozszerzenia, jak pokazano na odpowiedź, ale mam jedno nieobsługiwany sprawę w tej chwili:
Jak mogę "proxy" struktury z rozszerzonej biblioteki?
Na przykład mam to:
customer.h:
struct customer;
customer.c:
struct customer {
int children:1;
int age;
struct house *house_config;
};
Teraz, mój klient-extension.c piszę wszystko publiczne metody tworzą customer.c, ale jak mam "przekazywać" struktury?
Wielkie dzięki za poświęcony czas & pomoc!
Odpowiedź na pierwsze dodatkowe pytanie już udzielono. Drugi jest blisko spokrewniony - C/C++ nie zawiera żadnych metainformacji binarnych, takich jak Java/.NET, więc nie możesz zgadnąć, jak mogłaby wyglądać definicja struktury "klienta". Nawet jeśli pamiętasz typy i nazwy pól w tej strukturze, mogą wystąpić problemy z ustawieniami kompilatora - np. Wyrównanie pola. –
OK, dziękuję. Spróbuję teraz opublikowanej odpowiedzi :) –