我目前正在编译一个名为do_foo
的程序,如下所示:
gcc -Wall -Wextra -g3 -pthread do_foo.c -o do_foo
我按照这样运行:
LD_LIBRARY_PATH=.. LD_PRELOAD=libfoo.so ./do_foo
libfoo.so
很奇怪,因为:
有许多标有__attribute__((constructor))
和
拦截libc函数,例如malloc
,send
等
我没有使用LD_PRELOAD
链接libfoo.so
,而是希望在编译时这样做。我希望能够这样做:
gcc -Wall -Wextra -g3 -L.. -lfoo -pthread do_foo.c -o do_foo_ld
但这不起作用:没有任何ctor函数运行,也没有任何libc函数被截获。当我运行ldd do_foo_ld
时,我在链接到它的库列表中看不到libfoo.so
。
哪些gcc标志等同于LD_PRELOAD
?我假设这两者之间有一些简单的翻译,但我还没能找到它。
编辑:我在以下方面取得了一些进展:
gcc -Wall -Wextra -g3 -nodefaultlibs -pthread -L.. -lfoo -lc -lgcc do_foo.c -o do_foo_ld
我的理由是,我需要首先使用-nodefaultlibs
阻止加载libc,然后链接libfoo.so
,然后手动拉取nodefaultlibs
之后取出的内容。有了这个,我没有得到关于来自libc的符号的未定义的引用错误,但我得到以下内容:
/tmp/ccSsQHmx.o: In function `fun_1':
/my/proj/do_foo.c:217: undefined reference to `pthread_create'
/tmp/ccSsQHmx.o: In function `fun_2':
/my/proj/do_foo.c:269: undefined reference to `pthread_create'
/tmp/ccSsQHmx.o: In function `fun_3':
/my/proj/do_foo.c:281: undefined reference to `pthread_join'
在-pthread
调用的各个点上,-lpthread
gcc
的任何组合似乎都无法解决问题,而且我不确定原因。我认为nodefaultlibs
可能意味着"阻止任何默认库被链接"而不仅仅是“不要将它们联系起来”,#34;所以我尝试制作一个新的符号链接:
ln -s /lib/x86_64-linux-gnu/libpthread.so.0 ../libnotpthread.so
并添加以下内容:
gcc -Wall -Wextra -g3 -nodefaultlibs -pthread -L.. -lfoo -lnotpthread -lc -lgcc do_foo.c -o do_foo_ld
但没有骰子。
我在这里缺少什么?
答案 0 :(得分:0)
您应将链接库放在源文件或目标文件之后:
gcc -Wall -Wextra -g3 do_foo.c -L.. -lfoo -pthread -o do_foo_ld
如果此方法无效,请尝试用大铁锤敲击:
gcc -Wall -Wextra -g3 do_foo.c -Wl,--no-as-needed -L.. -lfoo -Wl,--as-needed -pthread -o do_foo_ld
默认情况下,现代发行版启用-Wl,--as-needed
标志,如果先前的源文件或目标文件都不使用-lfoo
,则强制 public static string AzureADB2CHostname = "login.microsoftonline.com"; // or {Your-Tenant-Name}.b2clogin.com
public static string PolicySignUpSignIn = "b2c_1_susi";
public static string AuthorityBase = $"https://{AzureADB2CHostname}/tfp/{TenantId}/";
public static string Authority = $"{AuthorityBase}{PolicySignUpSignIn}";
被忽略(在您的情况下,没有文件,因此被视为未使用)。