[so] Probleme cu preloadarea simbolurilor C vs C++
Alexandru Trifan
alexandru.trifan at gmail.com
Thu Dec 1 17:13:28 EET 2005
Am urmat pasii temei si mi-am construit un libtip.so care sa suprascrie read
/ write, pentru statistici. Din obisnuinta, am inceput sa scriu in C++, si
am urmat obiceiul de a exporta simboluri:
#ifdef __cplusplus
extern "C"
{
#endif
// The method called when the library is loaded
void on_load( void ) __attribute__((constructor));
// The method called when the library is unloaded
void on_unload( void ) __attribute__((destructor));
// The overwritten read method
ssize_t read(int fd, void *buf, size_t count);
// The overwritten write method
ssize_t write(int fd, const void *buf, size_t count);
#ifdef __cplusplus
}
#endif
Le-am suprascris lasandu-le goale, intorcand doar niste valori stub.
Am obtinut obj-urile cu urmatoarea sectiune din makefile:
%.o: %.cpp
@$(CXX) -Wall -g -fPIC -c -o $@ $<
Am obtinut libraria cu urmatoarea sectiune din makefile:
$(OUTLIB): $(OBJS)
$(CXX) -shared -Wl,-soname,libtip.so -ldl -o libtip.so $(OBJS)
Am verificat existenta simbolurilor exportate, cu ajutorul nm. Totul este in
regula.
Problema e ca libraria mea nu functioneaza corect. Am incercat:
LD_LIBRARY_PATH=. LD_PRELOAD=libtip.so ls
Imi afiseaza continutul directorului la stdout. Am mai consultat niste
pareri de la cei batrani si mi s-a spus ca e posibil sa fie o problema de la
faptul ca libraria e compilata in C++, si ca sa incerc cu un program scris
in C++. Asa ca am facut clasicul "Hello world!" in main.cpp ( cu printf din
stdio.h ) si l-am compilat cu g++ si am incercat:
LD_LIBRARY_PATH=. LD_PRELOAD=libtip.so ./main
Care din nou nu a functionat corect, afisandu-mi mesajul. M-am gandit sa
purific calea catre apelul write ( pentru ca totusi printf apeleaza write )
si am scris direct write pe STDOUT_FILENO. Am rulat din nou si a functionat.
Problemele sunt, deci, urmatoarele:
1. De ce nu pot sa folosesc libraria mea compilata in C++ decat pentru
programe C++ (eventual ce flaguri am / n-am pus la compilare)
2. De ce, totusi, pentru programele C++, daca apelez printf in
programul de test nu se intercepteaza apelul de catre libraria mea (
main.cpp a fost compilat cu "g++ -o main main.cpp"
Am sa scriu libraria in C, dar totusi as vrea niste explicatii pentru ceea
ce se intampla.
Va multumesc!
--
Regards,
Alexandru Trifan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://cursuri.cs.pub.ro/pipermail/so/attachments/20051201/ef2a90d1/attachment.htm
More information about the so
mailing list