diff options
| -rw-r--r-- | meta/classes/package.bbclass | 202 |
1 files changed, 97 insertions, 105 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index 679055ff1b..164e38c505 100644 --- a/meta/classes/package.bbclass +++ b/meta/classes/package.bbclass | |||
| @@ -722,8 +722,9 @@ python split_and_strip_files () { | |||
| 722 | # | 722 | # |
| 723 | # First lets figure out all of the files we may have to process ... do this only once! | 723 | # First lets figure out all of the files we may have to process ... do this only once! |
| 724 | # | 724 | # |
| 725 | file_list = {} | 725 | elffiles = {} |
| 726 | file_links = {} | 726 | symlinks = {} |
| 727 | hardlinks = {} | ||
| 727 | kernmods = [] | 728 | kernmods = [] |
| 728 | if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1') and \ | 729 | if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1') and \ |
| 729 | (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'): | 730 | (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'): |
| @@ -734,119 +735,111 @@ python split_and_strip_files () { | |||
| 734 | kernmods.append(file) | 735 | kernmods.append(file) |
| 735 | continue | 736 | continue |
| 736 | 737 | ||
| 737 | # Only process files (and symlinks)... Skip files that are obviously debug files | 738 | # Skip debug files |
| 738 | if not (debugappend != "" and file.endswith(debugappend)) and \ | 739 | if debugappend and file.endswith(debugappend): |
| 739 | not (debugdir != "" and debugdir in os.path.dirname(file[len(dvar):])) and \ | 740 | continue |
| 740 | os.path.isfile(file): | 741 | if debugdir and debugdir in os.path.dirname(file[len(dvar):]): |
| 741 | try: | 742 | continue |
| 742 | s = os.stat(file) | 743 | |
| 743 | except OSError, (err, strerror): | 744 | try: |
| 744 | if err != errno.ENOENT: | 745 | s = os.stat(file) |
| 745 | raise | 746 | except OSError, (err, strerror): |
| 746 | # Skip broken symlinks | 747 | if err != errno.ENOENT: |
| 748 | raise | ||
| 749 | # Skip broken symlinks | ||
| 750 | continue | ||
| 751 | # Check its an excutable | ||
| 752 | if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH): | ||
| 753 | # If it's a symlink, and points to an ELF file, we capture the readlink target | ||
| 754 | if os.path.islink(file): | ||
| 755 | target = os.readlink(file) | ||
| 756 | if not os.path.isabs(target): | ||
| 757 | ltarget = os.path.join(os.path.dirname(file), target) | ||
| 758 | else: | ||
| 759 | ltarget = target | ||
| 760 | |||
| 761 | if isELF(ltarget): | ||
| 762 | #bb.note("Sym: %s (%d)" % (ltarget, isELF(ltarget))) | ||
| 763 | symlinks[file] = target | ||
| 747 | continue | 764 | continue |
| 748 | # Is the item excutable? Then we need to process it. | 765 | # It's a file (or hardlink), not a link |
| 749 | if (s[stat.ST_MODE] & stat.S_IXUSR) or \ | 766 | # ...but is it ELF, and is it already stripped? |
| 750 | (s[stat.ST_MODE] & stat.S_IXGRP) or \ | 767 | elf_file = isELF(file) |
| 751 | (s[stat.ST_MODE] & stat.S_IXOTH): | 768 | if elf_file & 1: |
| 752 | # If it's a symlink, and points to an ELF file, we capture the readlink target | 769 | if elf_file & 2: |
| 753 | if os.path.islink(file): | 770 | bb.warn("File '%s' from %s was already stripped, this will prevent future debugging!" % (src, pn)) |
| 754 | target = os.readlink(file) | ||
| 755 | if not os.path.isabs(target): | ||
| 756 | ltarget = os.path.join(os.path.dirname(file), target) | ||
| 757 | else: | ||
| 758 | ltarget = target | ||
| 759 | |||
| 760 | if isELF(ltarget): | ||
| 761 | #bb.note("Sym: %s (%d)" % (ltarget, isELF(ltarget))) | ||
| 762 | file_list[file] = "sym: " + target | ||
| 763 | continue | 771 | continue |
| 764 | # It's a file (or hardlink), not a link | 772 | # Check if it's a hard link to something else |
| 765 | # ...but is it ELF, and is it already stripped? | 773 | if s.st_nlink > 1: |
| 766 | elf_file = isELF(file) | 774 | file_reference = "%d_%d" % (s.st_dev, s.st_ino) |
| 767 | if elf_file & 1: | 775 | # Hard link to something else |
| 768 | # Check if it's a hard link to something else | 776 | hardlinks[file] = file_reference |
| 769 | if s.st_nlink > 1: | 777 | continue |
| 770 | file_reference = "%d_%d" % (s.st_dev, s.st_ino) | 778 | elffiles[file] = elf_file |
| 771 | # Hard link to something else | ||
| 772 | file_list[file] = "hard: " + file_reference | ||
| 773 | continue | ||
| 774 | |||
| 775 | file_list[file] = "ELF: %d" % elf_file | ||
| 776 | |||
| 777 | 779 | ||
| 778 | # | 780 | # |
| 779 | # First lets process debug splitting | 781 | # First lets process debug splitting |
| 780 | # | 782 | # |
| 781 | if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1'): | 783 | if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1'): |
| 782 | for file in file_list: | 784 | hardlinkmap = {} |
| 785 | # For hardlinks, process only one of the files | ||
| 786 | for file in hardlinks: | ||
| 787 | file_reference = hardlinks[file] | ||
| 788 | if file_reference not in hardlinkmap: | ||
| 789 | # If this is a new file, add it as a reference, and | ||
| 790 | # update it's type, so we can fall through and split | ||
| 791 | elffiles[file] = isELF(file) | ||
| 792 | hardlinkmap[file_reference] = file | ||
| 793 | |||
| 794 | for file in elffiles: | ||
| 783 | src = file[len(dvar):] | 795 | src = file[len(dvar):] |
| 784 | dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend | 796 | dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend |
| 785 | fpath = dvar + dest | 797 | fpath = dvar + dest |
| 786 | # Preserve symlinks in debug area... | ||
| 787 | if file_list[file].startswith("sym: "): | ||
| 788 | ltarget = file_list[file][5:] | ||
| 789 | lpath = os.path.dirname(ltarget) | ||
| 790 | lbase = os.path.basename(ltarget) | ||
| 791 | ftarget = "" | ||
| 792 | if lpath and lpath != ".": | ||
| 793 | ftarget += lpath + debugdir + "/" | ||
| 794 | ftarget += lbase + debugappend | ||
| 795 | if lpath.startswith(".."): | ||
| 796 | ftarget = os.path.join("..", ftarget) | ||
| 797 | bb.mkdirhier(os.path.dirname(fpath)) | ||
| 798 | #bb.note("Symlink %s -> %s" % (fpath, ftarget)) | ||
| 799 | os.symlink(ftarget, fpath) | ||
| 800 | continue | ||
| 801 | 798 | ||
| 802 | # Preserve hard links in debug area... | 799 | # Split the file... |
| 803 | file_reference = "" | 800 | bb.utils.mkdirhier(os.path.dirname(fpath)) |
| 804 | if file_list[file].startswith("hard: "): | 801 | #bb.note("Split %s -> %s" % (file, fpath)) |
| 805 | file_reference = file_list[file][6:] | 802 | # Only store off the hard link reference if we successfully split! |
| 806 | if file_reference not in file_links: | 803 | splitdebuginfo(file, fpath, debugsrcdir, d) |
| 807 | # If this is a new file, add it as a reference, and | ||
| 808 | # update it's type, so we can fall through and split | ||
| 809 | file_list[file] = "ELF: %d" % (isELF(file)) | ||
| 810 | else: | ||
| 811 | target = file_links[file_reference][len(dvar):] | ||
| 812 | ftarget = dvar + debuglibdir + os.path.dirname(target) + debugdir + "/" + os.path.basename(target) + debugappend | ||
| 813 | bb.mkdirhier(os.path.dirname(fpath)) | ||
| 814 | #bb.note("Link %s -> %s" % (fpath, ftarget)) | ||
| 815 | os.link(ftarget, fpath) | ||
| 816 | continue | ||
| 817 | |||
| 818 | # It's ELF... | ||
| 819 | if file_list[file].startswith("ELF: "): | ||
| 820 | elf_file = int(file_list[file][5:]) | ||
| 821 | if elf_file & 2: | ||
| 822 | bb.warn("File '%s' from %s was already stripped, this will prevent future debugging!" % (src, pn)) | ||
| 823 | continue | ||
| 824 | 804 | ||
| 825 | # Split the file... | 805 | # Hardlink our debug symbols to the other hardlink copies |
| 826 | bb.mkdirhier(os.path.dirname(fpath)) | 806 | for file in hardlinks: |
| 827 | #bb.note("Split %s -> %s" % (file, fpath)) | 807 | if file not in elffiles: |
| 828 | # Only store off the hard link reference if we successfully split! | ||
| 829 | if splitdebuginfo(file, fpath, debugsrcdir, d) == 0 and file_reference != "": | ||
| 830 | file_links[file_reference] = file | ||
| 831 | |||
| 832 | # The above may have generated dangling symlinks, remove them! | ||
| 833 | # Dangling symlinks are a result of something NOT being split, such as a stripped binary. | ||
| 834 | # This should be a rare occurance, but we want to clean up anyway. | ||
| 835 | for file in file_list: | ||
| 836 | if file_list[file].startswith("sym: "): | ||
| 837 | src = file[len(dvar):] | 808 | src = file[len(dvar):] |
| 838 | dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend | 809 | dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend |
| 839 | fpath = dvar + dest | 810 | fpath = dvar + dest |
| 840 | try: | 811 | file_reference = hardlinks[file] |
| 841 | s = os.stat(fpath) | 812 | target = hardlinkmap[file_reference][len(dvar):] |
| 842 | except OSError, (err, strerror): | 813 | ftarget = dvar + debuglibdir + os.path.dirname(target) + debugdir + "/" + os.path.basename(target) + debugappend |
| 843 | if err != errno.ENOENT: | 814 | bb.utils.mkdirhier(os.path.dirname(fpath)) |
| 844 | raise | 815 | #bb.note("Link %s -> %s" % (fpath, ftarget)) |
| 845 | #bb.note("Remove dangling link %s -> %s" % (fpath, os.readlink(fpath))) | 816 | os.link(ftarget, fpath) |
| 846 | os.unlink(fpath) | 817 | |
| 847 | # This could leave an empty debug directory laying around | 818 | # Create symlinks for all cases we were able to split symbols |
| 848 | # take care of the obvious case... | 819 | for file in symlinks: |
| 849 | subprocess.call("rmdir %s 2>/dev/null" % os.path.dirname(fpath), shell=True) | 820 | src = file[len(dvar):] |
| 821 | dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend | ||
| 822 | fpath = dvar + dest | ||
| 823 | # Skip it if the target doesn't exist | ||
| 824 | try: | ||
| 825 | s = os.stat(fpath) | ||
| 826 | except OSError, (err, strerror): | ||
| 827 | if err != errno.ENOENT: | ||
| 828 | raise | ||
| 829 | continue | ||
| 830 | |||
| 831 | ltarget = symlinks[file] | ||
| 832 | lpath = os.path.dirname(ltarget) | ||
| 833 | lbase = os.path.basename(ltarget) | ||
| 834 | ftarget = "" | ||
| 835 | if lpath and lpath != ".": | ||
| 836 | ftarget += lpath + debugdir + "/" | ||
| 837 | ftarget += lbase + debugappend | ||
| 838 | if lpath.startswith(".."): | ||
| 839 | ftarget = os.path.join("..", ftarget) | ||
| 840 | bb.utils.mkdirhier(os.path.dirname(fpath)) | ||
| 841 | #bb.note("Symlink %s -> %s" % (fpath, ftarget)) | ||
| 842 | os.symlink(ftarget, fpath) | ||
| 850 | 843 | ||
| 851 | # Process the debugsrcdir if requested... | 844 | # Process the debugsrcdir if requested... |
| 852 | # This copies and places the referenced sources for later debugging... | 845 | # This copies and places the referenced sources for later debugging... |
| @@ -861,11 +854,10 @@ python split_and_strip_files () { | |||
| 861 | if (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'): | 854 | if (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'): |
| 862 | strip = d.getVar("STRIP", True) | 855 | strip = d.getVar("STRIP", True) |
| 863 | sfiles = [] | 856 | sfiles = [] |
| 864 | for file in file_list: | 857 | for file in elffiles: |
| 865 | if file_list[file].startswith("ELF: "): | 858 | elf_file = int(elffiles[file]) |
| 866 | elf_file = int(file_list[file][5:]) | 859 | #bb.note("Strip %s" % file) |
| 867 | #bb.note("Strip %s" % file) | 860 | sfiles.append((file, elf_file, strip)) |
| 868 | sfiles.append((file, elf_file, strip)) | ||
| 869 | for f in kernmods: | 861 | for f in kernmods: |
| 870 | sfiles.append((f, 16, strip)) | 862 | sfiles.append((f, 16, strip)) |
| 871 | 863 | ||
