我有一些使用调试符号构建的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"