2010-07-27 9 views
0

J'ai décidé que ce serait un projet amusant de travailler sur les tsocks, car il n'a pas été mis à jour depuis 8 ans. Il est hébergé here sur GitHub.Erreur du compilateur lors de la modification de l'obsolète _init() pour utiliser __attribute ((constructeur))

J'ai seulement fait des changements cosmétiques au code jusqu'ici, mais maintenant j'ai couru dans une erreur de compilateur. Selon dlopen(3):

The obsolete symbols _init() and _fini()

[...]

Using these routines [...] is not recommended. Their use may result in undesired behavior, since the constructor/destructor routines will not be executed (unless special measures are taken).

Instead, libraries should export routines using the __attribute__((constructor)) and __attribute__((destructor)) function attributes.

Malheureusement, ce changement (commit f785c8e) semble être la source de l'erreur du compilateur:

gcc -fPIC -g -O2 -Wall -I. -c tsocks.c -o tsocks.o 
gcc -fPIC -g -O2 -Wall -I. -c common.c -o common.o 
gcc -fPIC -g -O2 -Wall -I. -c parser.c -o parser.o 
gcc -fPIC -g -O2 -Wall -I. -static -o saveme saveme.c 
gcc -fPIC -g -O2 -Wall -I. -o inspectsocks inspectsocks.c common.o -lc 
gcc -fPIC -g -O2 -Wall -I. -o validateconf validateconf.c common.o parser.o -lc 
gcc -fPIC -g -O2 -Wall -I. -o libtsocks.so.1.8 tsocks.o common.o parser.o -ldl -lc -rdynamic 
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 

Quelqu'un peut-il me aider? Je suis perplexe.

Répondre

1

Vous essayez de créer une bibliothèque partagée comme s'il s'agissait d'un exécutable. Voici ce que vous voulez:

SONAME = libtsocks.so.1 

$(SHLIB): $(OBJS) $(COMMON).o $(PARSER).o 
    $(SHCC) -shared -Wl,-soname,$(SONAME) $(CFLAGS) $(INCLUDES) -o $(SHLIB) \ 
    $(OBJS) $(COMMON).o $(PARSER).o $(SPECIALLIBS) $(LIBS) -rdynamic 
    ln -sf $(SHLIB) $(SONAME) 
    ln -sf $(SONAME) libtsocks.so 

La partie critique est l'ajout de -shared. Je vous ai également fixé un soname, que vous devez avoir et gérer correctement si vous voulez que les distributions Linux récupèrent votre bibliothèque, mais si vous ne savez pas ce que c'est, ne vous inquiétez pas jusqu'à ce que vous l'obteniez au point de vouloir faire une sortie officielle - à quel point, le temps d'en lire dans tous les détails sanglants. Malheureusement, je ne connais pas un bon endroit pour vous pointer.

Cela n'a en fait rien à voir avec _init/_fini par rapport à __attribute__((constructor)) - Je suis étonné que cela a fonctionné du tout.

+0

Cela a fonctionné. Les lignes 'ln' ne sont pas nécessaires; 'make install' finit par créer les liens. Je suppose que je devrais lire sur autoconf et les bibliothèques. J'aime sauter dans des projets non préparés; Je peux apprendre toutes ces nouvelles choses. Merci! – Nomexous