[devel] verify_elfsym

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Ср Сен 21 15:17:27 MSD 2005


Вот упрощенная реализация проверки ELF'ов, как я её себе представляю.
----------- следующая часть -----------
#!/bin/sh -ef

elf1_undefined_symbols()
{
	local elf="$1" err=
	err="$(ldd -r "$elf" 2>&1 1>/dev/null)" || return
	[ -n "$err" ] || return 0
	echo "$err" |awk '/^undefined symbol:/ {
		gsub("^[(]|[)]$", "", $NF)
		print $3 "\t" $NF
	}'
}

elf1_verify_strict()
{
	local elf="$1" err=
	err=$(elf1_undefined_symbols "$elf") || return 2
	[ -n "$err" ] || return 0
	echo "Error: $elf: undefined symbols" >&2
	echo "$err" >&2
	return 1
}

elf1_verify_relaxed()
{
	local elf="$1" symtab="$2" err=
	err=$(elf1_undefined_symbols "$elf") || return 2
	[ -n "$err" ] || return 0
	local rc=0 sym= obj=
	while IFS=$'\t' read -r sym obj; do
		if [ "$obj" != "$elf" ]; then
			echo "Error: $elf: undefined symbol: $sym ($obj)" >&2
			rc=1
		elif ! bloom -e "$sym" "$symtab"; then
			echo "Error: $elf: undefined symbol: $sym" >&2
			rc=1
		fi
	done <<<"$err"
	return $rc
}	

rc=0 symtab="$1"; shift
for elf; do
	type="$(file -b "$elf")"
	if [ -z "${type##*ELF*executable*dynamic*}" ]; then
		elf1_verify_strict "$elf" || rc=1
	elif [ -z "${type##*ELF*shared*}" -a -z "${elf##*/lib/lib*.so*}" ]; then
		elf1_verify_strict "$elf" || rc=1
	elif [ -z "${type##*ELF*dynamic*}" -o -z "${type##*ELF*shared*}" ]; then
		elf1_verify_relaxed "$elf" "$symtab" || rc=1
	fi	
done
exit $rc
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20050921/08ac0ade/attachment-0001.bin>


Подробная информация о списке рассылки Devel