linux下找不到libc 库,Linux-覆盖libc open()库函数
我在庫&中有glibc提供的相同的覆蓋open().我首先在庫中設置了LD_PRELOAD,因此當進程調用open()時,將調用庫中定義的open.
問題:-glibc中還有其他幾個函數,一旦示例為getpt(),就會調用open(),當getpt()調用open()時,將調用glibc中定義的open(),我將如何使getpt ()調用在我的library()中定義的open().
限制:-我沒有選擇編譯glibc的選項.
解決方法:
正如tmcguire正確指出的那樣,從posix_openpt到__open的調用是對內部符號的調用,并且不能插入.
實際上,glibc開發人員認為此調用是實現細節,您無需進行任何更改.
I am looking at compile time solution
你不能擁有它.
than run time solution cause run time solution will have performance impact.
運行時解決方案不必對性能有任何影響(除了調用open而不是glibcs??的開銷外).
我只知道庫插入glibc內部調用的一種方式:運行時修補.這個想法是為了
>找到libc.so.6 open的地址(這是__open的別名),
>在運行時找到glibc .text節的邊界
>掃描以查找__open指令
>對于任何此類指示
> mprotect它所在的頁面可寫
>計算一條名為CALL my_open的新指令,并將其修補為原始指令的“頂部”
> m保護頁面回讀和執行
這很丑陋,但在i * 86(32位)Linux上可以正常使用,在C *中,CALL可以“到達” 4GB地址空間內的任何其他指令.對于x86_64而言,它不起作用,其中CALL仍限于/ 2GB,但是從庫到glibc的距離可能會更多.
在這種情況下,您需要在libc.so.6中找到一個合適的蹦床,您可以將原始的CALL重定向到該蹦床,并可以將寄存器間接JMP放置到最終的目的地.幸運的是,由于函數對齊,libc.so.6通常具有多個大小適當的未使用的NOP區域.
標簽:gcc,override,glibc,ld,linux
來源: https://codeday.me/bug/20191121/2055603.html
總結
以上是生活随笔為你收集整理的linux下找不到libc 库,Linux-覆盖libc open()库函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: krc 编辑 linux,Linux网络
- 下一篇: linux gcc出错,编译arm-li