不修改代码为共享对象添加解释器的方法求助
解决共享库手动添加解释器的问题
核心问题分析
你之前用objcopy添加.interp段后出现的警告allocated section '.interp' not in segment是关键:该段仅被加入到section表,但未关联到可加载的程序段(Segment),导致操作系统加载时无法识别解释器路径。下面提供两种可行方案:
方案一:编译时直接指定解释器(最优解)
修改编译命令,通过链接器选项直接指定解释器,链接器会自动生成正确的.interp段并关联到程序段,无需后续手动修改:
gcc -shared -fPIC -Wl,--entry=print_version -Wl,--dynamic-linker=/lib64/ld-linux-x86-64.so.2 -o lib.so lib.c
验证:执行readelf -l lib.so,能看到PT_INTERP类型的程序头条目,指向.interp段;执行./lib.so可直接触发print_version函数。
方案二:修复已编译的共享库
如果已经有编译好的lib.so,可通过以下步骤补全解释器配置:
- 创建包含解释器路径的临时文件:
echo -n "/lib64/ld-linux-x86-64.so.2" > tempfile - 添加
.interp段并设置属性:objcopy --add-section .interp=tempfile --set-section-flags .interp=alloc,readonly lib.so lib_temp.so - 重新链接,将
.interp段纳入可加载程序段:
此步骤会让链接器重新整理段结构,确保ld -shared -o lib_final.so --entry=print_version --dynamic-linker=/lib64/ld-linux-x86-64.so.2 lib_temp.so -lc.interp被包含在LOAD程序段中,消除之前的警告并生效。
验证方法
执行以下命令确认配置正确:
# 查看程序头,确认存在PT_INTERP条目 readelf -l lib_final.so # 查看section表,确认.interp段的flags包含A(alloc) readelf -S lib_final.so
内容的提问来源于stack exchange,提问作者MaPo
相关产品推荐
相关产品推荐

