You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不修改代码为共享对象添加解释器的方法求助

解决共享库手动添加解释器的问题

核心问题分析

你之前用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,可通过以下步骤补全解释器配置:

  1. 创建包含解释器路径的临时文件:
    echo -n "/lib64/ld-linux-x86-64.so.2" > tempfile
    
  2. 添加.interp段并设置属性:
    objcopy --add-section .interp=tempfile --set-section-flags .interp=alloc,readonly lib.so lib_temp.so
    
  3. 重新链接,将.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:03:15