[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