gpt4 book ai didi

将已弃用的 void _init() 更改为使用 __attribute((constructor)) 时出现编译器错误

转载 作者:行者123 更新时间:2023-11-30 16:04:12 26 4
gpt4 key购买 nike

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

到目前为止,我只对代码进行了外观更改,但现在遇到了编译器错误。根据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.

不幸的是,这个更改(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

有人可以帮助我吗?我被难住了。

最佳答案

您正在尝试创建一个共享库,就好像它是一个可执行文件一样。这就是您想要的:

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/_fini__attribute__((constructor)) 没有任何关系 - 我很惊讶完全有效。

关于将已弃用的 void _init() 更改为使用 __attribute((constructor)) 时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3340305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com