关于C语言程序的换库很久以前在编译带debug_info的glibc中也提到过一下,首先是用vim把程序的ld连接库更换掉,然后用LD_LIBRARY_PATH设置好libc的路径就可以了,但直到今天做了CAOV这道C++题后才发现直接这样搞好像行不通。
![](https://static-img.0xffff.one/MJjJtTazABY_bSMaUJNrXsMC5Whv4PStcbF8w4VH6Jw/q:90/w:800/rt:fit/aHR0cHM6Ly9zdGF0/aWMuMHhmZmZmLm9u/ZS9hc3NldHMvZmls/ZXMvMjAyMC0wMy0w/Mi8xNTgzMTMxOTgx/LTI4NTcwNy1kYjVk/YzI1NC1kZWE5LTQ1/ODAtYWQ3NC0yYTcw/MDhmM2YxMmUucG5n.jpg)
然后在打算重新编一个stdlibc++时发现,这个库在本地就有了,而且还是不受ld-linux的版本影响的,通过find命令可以找到,通常都在usr目录中可以找到。
![](https://static-img.0xffff.one/Yi7YsME3C7NOIemViloozWksr2mvhQQfCc3m_yDkHKk/q:90/w:800/rt:fit/aHR0cHM6Ly9zdGF0/aWMuMHhmZmZmLm9u/ZS9hc3NldHMvZmls/ZXMvMjAyMC0wMy0w/Mi8xNTgzMTMyMTQx/LTk0NTE0Mi0zODVi/NzEyMC1jZWRjLTRh/OTktYjNlNi0zNjQ4/YjMxMzRjODcucG5n.jpg)
同样的方法也可以找到另一个缺的库libgcc_s.so.1,据说stdlibc++是跟gcc版本有关的(好像是gcc自带的),不同版本的gcc要用对应的stdlibc++库。
然后重新组织一下启动命令就可以运行起来了
![](https://static-img.0xffff.one/oMyHtIm4SbRQNNiBcpo3S3fSBMCLLr4PKUuYW6hq5Y8/q:90/w:800/rt:fit/aHR0cHM6Ly9zdGF0/aWMuMHhmZmZmLm9u/ZS9hc3NldHMvZmls/ZXMvMjAyMC0wMy0w/Mi8xNTgzMTMyMzAx/LTcxMDk0MS05NTU2/YjUzNC1kZDEzLTQ3/NWQtYWYwMi01N2Fi/YWY3NTMxMTAucG5n.jpg)
如果要运行题目给的libc库的话可以在重新组织一下启动命令,把题目给的库的路径(库名要跟ldd出来的名字一样)放在LD_LIBRARY_PATH的最前面,因为LD_LIBRARY_PATH的调用顺序是从前到后、从左到右的,因为程序还需要一个libm库,所以要把自己系统的libm路径也加上。
![](https://static-img.0xffff.one/N1E7Mn6cPObqJiJvtolssjx9aEB46ia_tFKKmjBDavQ/q:90/w:800/rt:fit/aHR0cHM6Ly9zdGF0/aWMuMHhmZmZmLm9u/ZS9hc3NldHMvZmls/ZXMvMjAyMC0wMy0w/Mi8xNTgzMTMyNTk0/LTk0MTQ0Mi00NTVj/ZWNhMi05NjYyLTQz/YzktODJhYy02Yjg0/YmI4YzhiYzAucG5n.jpg)
(据说用apt也可以下载到带debug_info的stdlibc++的🤔)