0

我决定在 tsocks 上做一些工作是一个有趣的副项目,因为它已经 8 年没有看到任何更新了。它托管GitHub 上。

到目前为止,我只对代码进行了外观上的更改,但现在我遇到了编译器错误。根据dlopen(3)

过时的符号 _init() 和 _fini()

[...]

不推荐使用这些例程 [...]。它们的使用可能会导致不希望的行为,因为不会执行构造函数/析构函数例程(除非采取特殊措施)。

相反,库应该使用 __attribute__((constructor)) 和 __attribute__((destructor)) 函数属性导出例程。

不幸的是,此更改(提交 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 回答