public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Anthony G. Basile" <blueness@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/elfix:elfix-0.7.x commit in: misc/
Date: Sat, 29 Dec 2012 01:16:09 +0000 (UTC)	[thread overview]
Message-ID: <1356743285.84fe9e25837f92d5354f1ef2171fed538481e3a5.blueness@gentoo> (raw)

commit:     84fe9e25837f92d5354f1ef2171fed538481e3a5
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Tue Dec 25 14:22:06 2012 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Sat Dec 29 01:08:05 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=84fe9e25

misc/link_maps_portage: dumped, misc/link_maps now uses portage only

---
 misc/link_maps         |   66 ++++++---------
 misc/link_maps_portage |  217 ------------------------------------------------
 2 files changed, 28 insertions(+), 255 deletions(-)

diff --git a/misc/link_maps b/misc/link_maps
index a7c59ba..9b774bc 100755
--- a/misc/link_maps
+++ b/misc/link_maps
@@ -13,6 +13,7 @@ import os
 import sys
 import re
 import pax
+import portage
 
 
 """
@@ -29,26 +30,21 @@ Here the sonames were obtained from the ELF object by scanelf -nm
 """
 def get_object_needed():
 
-	var_db_pkg = '/var/db/pkg'
+	vardb = portage.db[portage.root]["vartree"].dbapi
 
 	object_needed = {}
-	for cat in os.listdir(var_db_pkg):
-		catdir = '%s/%s' % (var_db_pkg, cat)
-		for pkg in os.listdir(catdir):
-			pkgdir = '%s/%s' % (catdir, pkg)
-			need = '%s/%s' % (pkgdir, 'NEEDED.ELF.2')
-			try:
-				g = open(need, 'r')
-				needs = g.readlines()
-				for line in needs:
-					line = line.strip()
-					link = re.split(';', line)
-					abi = link[0]
-					elf = link[1]
-					sonames = re.split(',', link[4])
-					object_needed.setdefault(abi,{}).update({elf:sonames})
-			except IOError:
-				continue #File probably doesn't exist, which is okay
+
+	for pkg in vardb.cpv_all():
+		needs = vardb.aux_get(pkg, ['NEEDED.ELF.2'])[0].strip()
+		if not needs:			#skip empty lines
+			continue
+		lines = re.split('\n', needs)
+		for line in lines:
+			link = re.split(';', line)
+			abi = link[0]
+			elf = link[1]
+			sonames = re.split(',', link[4])
+			object_needed.setdefault(abi,{}).update({elf:sonames})
 
 	return object_needed
 
@@ -64,30 +60,24 @@ and its inverse which has structure
 """
 def get_libraries():
 
-	var_db_pkg = '/var/db/pkg'
+	vardb = portage.db[portage.root]["vartree"].dbapi
 
 	library2soname = {}
 	soname2library = {}
 
-	for cat in os.listdir(var_db_pkg):
-		catdir = '%s/%s' % (var_db_pkg, cat)
-		for pkg in os.listdir(catdir):
-			pkgdir = '%s/%s' % (catdir, pkg)
-			need = '%s/%s' % (pkgdir, 'NEEDED.ELF.2')
-			try:
-				g = open(need, 'r')
-				needs = g.readlines()
-				for line in needs:
-					line = line.strip()
-					link = re.split(';', line)
-					abi = link[0]
-					elf = link[1]
-					soname = link[2]
-					if soname:					#no soname => executable
-						library2soname[elf] = (soname,abi)
-						soname2library[(soname,abi)] = elf
-			except IOError:
-				continue #File probably doesn't exist, which is okay
+	for pkg in vardb.cpv_all():
+		needs = vardb.aux_get(pkg, ['NEEDED.ELF.2'])[0].strip()
+		if not needs:			#skip empty lines
+			continue
+		lines = re.split('\n', needs)
+		for line in lines:
+			link = re.split(';', line)
+			abi = link[0]
+			elf = link[1]
+			soname = link[2]
+			if soname:				#no soname => executable
+				library2soname[elf] = (soname,abi)
+				soname2library[(soname,abi)] = elf
 
 	return ( library2soname, soname2library )
 

diff --git a/misc/link_maps_portage b/misc/link_maps_portage
deleted file mode 100755
index 9b774bc..0000000
--- a/misc/link_maps_portage
+++ /dev/null
@@ -1,217 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Note: This alternative way of doing revdep-pax only
-# works on Gentoo systems where NEEDED.ELF.2 all the
-# information we need generated by scanelf during emerge.
-#
-# See /usr/lib/portage/bin/misc-functions.sh ~line 520
-# echo "${arch:3};${obj};${soname};${rpath};${needed}" >> "${PORTAGE_BUILDDIR}"/build-info/NEEDED.ELF.2
-#
-
-import os
-import sys
-import re
-import pax
-import portage
-
-
-"""
-Return object_needed dictionary which has structure
-
-	{
-		abi1 : { full_path_to_ELF_object : [ soname1, soname2, ... ], ... },
-		abi2 : { full_path_to_ELF_object : [ soname1, soname2, ... ], ... },
-		....
-	}
-
-Here the sonames were obtained from the ELF object by scanelf -nm
-(like readelf -d) during emerge.
-"""
-def get_object_needed():
-
-	vardb = portage.db[portage.root]["vartree"].dbapi
-
-	object_needed = {}
-
-	for pkg in vardb.cpv_all():
-		needs = vardb.aux_get(pkg, ['NEEDED.ELF.2'])[0].strip()
-		if not needs:			#skip empty lines
-			continue
-		lines = re.split('\n', needs)
-		for line in lines:
-			link = re.split(';', line)
-			abi = link[0]
-			elf = link[1]
-			sonames = re.split(',', link[4])
-			object_needed.setdefault(abi,{}).update({elf:sonames})
-
-	return object_needed
-
-
-"""
-Return library2soname dictionary which has structure
-
-	{ full_path_to_library : (soname, abi), ... }
-
-and its inverse which has structure
-
-	{ (soname, abi) : full_path_to_library, ... }
-"""
-def get_libraries():
-
-	vardb = portage.db[portage.root]["vartree"].dbapi
-
-	library2soname = {}
-	soname2library = {}
-
-	for pkg in vardb.cpv_all():
-		needs = vardb.aux_get(pkg, ['NEEDED.ELF.2'])[0].strip()
-		if not needs:			#skip empty lines
-			continue
-		lines = re.split('\n', needs)
-		for line in lines:
-			link = re.split(';', line)
-			abi = link[0]
-			elf = link[1]
-			soname = link[2]
-			if soname:				#no soname => executable
-				library2soname[elf] = (soname,abi)
-				soname2library[(soname,abi)] = elf
-
-	return ( library2soname, soname2library )
-
-
-"""
-Return soname_needed dictionary which has structure:
-
-	{
-		abi1: { soname: [ soname1, soname2, ... ], .... },
-		abi2: { soname: [ soname1, soname2, ... ], .... },
-	}
-
-Here the soname1, soname2,... were obtained from soname's corresponding
-ELF object by scanelf -n during emerge.
-"""
-def get_soname_needed( object_needed, library2soname ):
-
-	soname_needed = {}
-
-	for abi in object_needed:
-		for elf in object_needed[abi]:
-			try:
-				(soname, abi_check) = library2soname[elf]
-				if abi != abi_check:
-					print("This should never happen!")
-					sys.exit(1)
-				soname_needed.setdefault(abi,{}).update({soname:object_needed[abi][elf]})
-			except KeyError:
-				continue  # no soname, its probably an executable
-
-	return soname_needed
-
-
-"""
-Expands the object_needed dictionary which has structure
-
-	{
-		abi1 : { full_path_to_ELF_object : [ soname1, soname2, ... ], ... },
-		abi2 : { full_path_to_ELF_object : [ soname1, soname2, ... ], ... },
-		....
-	}
-
-such that the soname's are traced all the way to the end of
-the link chain.  Here the sonames should be the same as those
-obtained from the ELF object by ldd.
-"""
-def expand_linkings( object_needed, soname2library ):
-
-	for abi in object_needed:
-		for elf in object_needed[abi]:
-			while True:
-				found_new_soname = False
-				for so in object_needed[abi][elf]:					# For all the first links ...
-					try:
-						for sn in object_needed[abi][soname2library[(so,abi)]]:	# go to the next links ...
-							if sn in object_needed[abi][elf]:		# skip if already included ...
-								continue
-							if not (sn,abi) in soname2library:		# skip if vdso ...
-								continue
-							# This appends to the object_needed
-							# and soname_needed lists.  No copy
-							# was done so its the same lists in
-							# memory for both, and its modified
-							# for both.
-							object_needed[abi][elf].append(sn)	# otherwise collapse it back into
-							found_new_soname = True			# first links of the chain.
-
-					except KeyError:					# Not all nodes in the chain have a next node
-						continue
-
-				if not found_new_soname:					# We're done, that last iteration found
-					break							# no new nodes
-
-
-def get_object_reverse_linkings( object_linkings ):
-	object_reverse_linkings = {}
-
-	for abi in object_linkings:
-		for elf in object_linkings[abi]:
-			for soname in object_linkings[abi][elf]:
-				object_reverse_linkings.setdefault(abi,{}).setdefault(soname,[]).append(elf)
-
-	return object_reverse_linkings
-
-
-def main():
-
-	# Run as root to be able to real all files
-	uid = os.getuid()
-	if uid != 0:
-		print('RUN AS ROOT: cannot read all flags')
-		sys.exit(0)
-
-	object_needed = get_object_needed()
-	( library2soname, soname2library ) = get_libraries()
-	soname_needed = get_soname_needed( object_needed, library2soname )
-
-	# After the appending to needed in expand_linkings(), forward_needed
-	# and soname_needed have been extended through the entire chain of linking.
-	# If we want to keep only the object_needed and soname_needed, then do
-	# a copy before calling expand_linkings().
-	expand_linkings( soname_needed, soname2library )
-
-	object_linkings = object_needed
-	object_needed = None
-
-	soname_linkings = soname_needed
-	soname_needed = None
-
-	object_reverse_linkings = get_object_reverse_linkings( object_linkings )
-
-	""" Print out all ELF objects and the NEEDED sonames and full library paths """
-	for abi in object_linkings:
-		for elf in object_linkings[abi]:
-			sonames = object_linkings[abi][elf]
-			print("%s: %s" % (abi,elf))
-			for soname in sorted(object_linkings[abi][elf]):
-				try:
-					print("\t%s\t=> %s" % (soname, soname2library[(soname,abi)]))
-				except KeyError:
-					print("\t%s\t=> %s " % (soname, '***'))
-			print("\n\n")
-
-	""" Print out all ELF objects and the NEEDED sonames and full library paths """
-	for abi in object_linkings:
-		for soname in object_reverse_linkings[abi]:
-			try:
-				print("%s: %s\t=> %s" % (abi, soname, soname2library[(soname,abi)]))
-			except KeyError:
-				print("%s: %s\t=>%s " % (abi, soname, '***'))
-			for elf in sorted(object_reverse_linkings[abi][soname]):
-				print("\t%s" % elf)
-			print("\n\n")
-
-
-if __name__ == '__main__':
-	main()


             reply	other threads:[~2012-12-29  1:16 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-29  1:16 Anthony G. Basile [this message]
  -- strict thread matches above, loose matches on Subject: below --
2012-12-29  1:29 [gentoo-commits] proj/elfix:elfix-0.7.x commit in: misc/ Anthony G. Basile
2012-12-29  1:16 Anthony G. Basile
2012-12-29  1:16 Anthony G. Basile
2012-12-29  1:16 Anthony G. Basile
2012-12-29  1:16 Anthony G. Basile
2012-12-29  1:16 Anthony G. Basile
2012-12-29  1:16 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile
2012-12-24 10:59 Anthony G. Basile

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1356743285.84fe9e25837f92d5354f1ef2171fed538481e3a5.blueness@gentoo \
    --to=blueness@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox