思路LD_PRELOAD是在原来的共享库之前加载一个共享库,比如我可以先编译mylib.so加载它libc.so,所以当进程要使用printf它时,它会在so那个加载的那个中一一搜索找到mylib.so(因为这个so是先加载的) ) 而不是libc.so,所以它使用printfinmylib.so而不是printfin libc.so。
我明白为什么这个工程上都在实现的功能so一样printf的libc.so。
但是当我想挂钩write函数或其他syscall函数时,为什么会起作用?进程不搜索 中的函数so,它直接进入内核。
是否LD_PRELOAD适用于静态编译的二进制文件?为什么?在此重播中/sf/answers/970662801/提到LD PRELOAD不适用于静态二进制
为什么LD_PRELOAD在动态编译的二进制文件上工作以在系统调用上创建钩子?
架构是ARM。
如果我想在 Linux 中嗅探数据包而不设置任何过滤器,我看到了 2 个选项。
使用libpcap
自己使用原始套接字,例如https://www.binarytides.com/packet-sniffer-code-in-c-using-linux-sockets-bsd-part-2/
为什么libpcap比我自己使用原始套接字更好?
在 Linux(在 ARM 上运行)中,有一个进程有一个打开的 fd ,并且每隔几秒/dev/watchdog/发送一个fd 作为保持活动状态:ioctl()
while (1) {
ioctl(fd, WDIOC_KEEPALIVE, 0);
sleep(10);
}
Run Code Online (Sandbox Code Playgroud)
我也想从另一个进程发送保持活动状态,但我无法打开另一个 fd /dev/watchdog/:当我尝试回显时,/dev/watchdog/我收到错误“设备或资源忙”。
我在哪里可以看到看门狗被定义为一次仅适用于 1 个进程?(我在另一个Linux中看到有些进程可以打开fd /dev/watchdog/)。
我该怎么做才能从两个进程喂养看门狗?
我想在 Arm Linux 中编写简单而简短的汇编代码,并且永远等待。
label:
b label
Run Code Online (Sandbox Code Playgroud)
这可行,但需要大量 CPU 时间。
我考虑过nanosleep 每 X 秒使用并跳转到标签,但是如何在汇编中使用它?
pause系统调用(在注释中建议)不好,因为该进程有一个信号处理程序。
有简单的方法吗?
linux ×5
arm ×4
c ×3
assembly ×1
github ×1
ld-preload ×1
libpcap ×1
linux-kernel ×1
openssl ×1
sleep ×1
system-calls ×1
watchdog ×1