0

tsocks は 8 年間まったく更新されていないので、tsocks に関する作業を行うのは楽しいサイド プロジェクトになると判断しました。これは GitHub でホストされています。

これまでのところ、コードに表面的な変更を加えただけですが、コンパイル エラーが発生しました。によるとdlopen(3)

廃止されたシンボル _init() および _fini()

[...]

これらのルーチンの使用 [...] は推奨されません。コンストラクタ/デストラクタ ルーチンは実行されないため (特別な措置を講じない限り)、それらを使用すると望ましくない動作が発生する可能性があります。

代わりに、ライブラリは __attribute__((constructor)) および __attribute__((destructor)) 関数属性を使用してルーチンをエクスポートする必要があります。

残念ながら、この変更 (commit f785c8e) がコンパイラ エラーの原因のようです。

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

誰でも私を助けることができますか?私は困惑しています。

4

1 に答える 1

1

実行可能ファイルであるかのように共有ライブラリを作成しようとしています。これはあなたが望むものです:

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

重要な部分は、の追加です-sharedまた、 sonameを持つように修正しました。これは、Linux ディストリビューションにライブラリを取得させたい場合に正しく処理する必要がありますが、それが何であるかわからない場合は、公式リリースを作成したいポイント - その時点で、すべての詳細を読む時間です。残念ながら、私はあなたを指し示すのに適した場所を知りません.

_initこれは実際には/ _finivsとは何の関係もありません__attribute__((constructor))- 私はそれがまったくうまくいったことに驚いています。

于 2010-07-27T02:14:10.390 に答える