gpt4 book ai didi

c - 为什么我的共享库中的 __attribute__((constructor)) 不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:13 25 4
gpt4 key购买 nike

我在 ctor.c 中有这段代码:

#include<stdio.h>

static void __attribute__((constructor)) ctor() {
printf("HAHA");
}

我编译它:

clang -o shared.so -fPIC ctor.c -shared

然后我运行:

LD_PRELOAD=shared.so echo Hallo

它打印

Hallo

我期待看到:

HAHAHallo

为什么这不起作用?

关于二进制文件的一些信息:

> objdump -s -j .init_array shared.so

shared.so: file format elf64-x86-64

Contents of section .init_array:
200798 b0060000 00000000 e0060000 00000000 ................

> nm shared.so
00000000002007b8 d _DYNAMIC
00000000002009b0 d _GLOBAL_OFFSET_TABLE_
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
0000000000000790 r __FRAME_END__
00000000002007b0 d __JCR_END__
00000000002007b0 d __JCR_LIST__
00000000002009e8 d __TMC_END__
00000000002009e8 B __bss_start
w __cxa_finalize@@GLIBC_2.2.5
0000000000000670 t __do_global_dtors_aux
00000000002007a8 t __do_global_dtors_aux_fini_array_entry
00000000002009e0 d __dso_handle
0000000000200798 t __frame_dummy_init_array_entry
w __gmon_start__
00000000002009e8 D _edata
00000000002009f0 B _end
0000000000000700 T _fini
0000000000000578 T _init
00000000002009e8 b completed.6661
00000000000006e0 t ctor
00000000000005e0 t deregister_tm_clones
00000000000006b0 t frame_dummy
U printf@@GLIBC_2.2.5
0000000000000620 t register_tm_clones

这表明:

(a) ctor 函数存在。对于一些有类似问题的人来说,它并没有被链接器删除。

(b) .init_array 在我看来没问题。有两个条目(而不是一个),它们指向 frame_dummy 和 ctor。 (我使用了这个答案:https://reverseengineering.stackexchange.com/a/12793)

(c) shared library constructor not working通过一步编译和链接解决了这个问题,我已经在这样做了

PS:我用gcc编译的时候也不行。

最佳答案

有两个错误:

(a) LD_PRELOAD 需要一个绝对路径。

(b) "echo"是一个 shell-builtin,因此不会启动任何二进制文件,因此不会预加载任何内容。使用我自己的“hello world”程序,它可以工作。

关于c - 为什么我的共享库中的 __attribute__((constructor)) 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48212805/

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