将gdb build-id部分添加到现有二进制文件

时间:2016-03-31 10:13:12

标签: debugging gcc gdb debug-symbols openwrt

我有一些使用调试符号构建的openwrt rootfs图像,并希望将符号剥离为单独的文件以适合设备,但也允许gdb自动从具有每个build-id符号的文件夹中加载符号。 / p>

openwrt构建系统不会向gcc命令添加-Wl,--build-id。有没有办法在objcopy --add-gnu-debuglink的工作方式之后添加这些build-id?或者将-Wl选项附加到每个openwrt链接命令?

手工添加部分有效,但build-id注释是字节对齐的,而ld则以4字节对齐:

# see https://www.technovelty.org/code/separate-debug-info.html

add-build-id() 
{
    local sha1="$1"
    local exename="$2"

    local tmp=`mktemp --suffix=build-id`

    if readelf --file-header $exename | grep "big endian" > /dev/null; then
        echo -en "\x00\x00\x00\x04" >> $tmp # name_size
        echo -en "\x00\x00\x00\x14" >> $tmp # hash_size
        echo -en "\x00\x00\x00\x03" >> $tmp # NT_GNU_BUILD_ID
    elif readelf --file-header $exename | grep "little endian" > /dev/null; then
        echo -en "\x04\x00\x00\x00" >> $tmp # name_size
        echo -en "\x14\x00\x00\x00" >> $tmp # hash_size
        echo -en "\x03\x00\x00\x00" >> $tmp # NT_GNU_BUILD_ID
    else
        echo >&2 "Could not determine endianness for: $exename"
        return 1
    fi

    echo -en "GNU\x00" >> $tmp # GNU\0
    echo $sha1 | xxd -ps -r >> $tmp

    objcopy --add-section .note.gnu.build-id=$tmp $exename
    rm $tmp
}

add-build-id `sha1sum "$1"` "$1"

0 个答案:

没有答案