gcc标志相当于LD_PRELOAD?

时间:2016-01-08 23:05:39

标签: c gcc linker ld

我目前正在编译一个名为do_foo的程序,如下所示:

gcc -Wall -Wextra -g3 -pthread do_foo.c -o do_foo

我按照这样运行:

LD_LIBRARY_PATH=.. LD_PRELOAD=libfoo.so ./do_foo

libfoo.so很奇怪,因为:

  1. 有许多标有__attribute__((constructor))

  2. 的功能
  3. 拦截libc函数,例如mallocsend

  4. 我没有使用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
    

    但没有骰子。

    我在这里缺少什么?

1 个答案:

答案 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}"; 被忽略(在您的情况下,没有文件,因此被视为未使用)。

相关问题