gpt4 book ai didi

c - 相当于 LD_PRELOAD 的 gcc 标志?

转载 作者:行者123 更新时间:2023-12-02 04:44:15 26 4
gpt4 key购买 nike

我目前正在编译一个名为 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. 拦截 mallocsend 等 libc 函数

我不想使用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 中得到关于符号的 undefined reference 错误,但我确实得到了以下信息:

/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 -lpthreadgcc 调用中的不同位置的组合似乎无法修复它,我不确定为什么.我认为 nodefaultlibs 可能意味着“阻止任何默认库被链接”而不仅仅是“还不链接它们”,所以我尝试创建一个新的符号链接(symbolic link):

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

但没有骰子。

我在这里错过了什么?

最佳答案

您应该将链接库放在源文件或目标文件之后:

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 (在你的情况没有文件,所以它被认为是未使用的)。

关于c - 相当于 LD_PRELOAD 的 gcc 标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687550/

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