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()
next 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