On Wed, May 30, 2007 at 10:30:05AM +0200, Bastian Blank wrote: > D-I may be also affected and mklibs needs to pull in libgcc_s.so.1 > always if it catches a glibc. The attached mklibs patch always adds libgcc for old-abi arm. Bastian -- Well, Jim, I'm not much of an actor either.
Index: debian/control
===================================================================
--- debian/control (revision 108)
+++ debian/control (working copy)
@@ -8,7 +8,7 @@
Package: mklibs
Architecture: all
-Depends: python, binutils, gcc, mklibs-copy (>= 0.1.21)
+Depends: python, binutils, gcc, mklibs-copy (>= ${source:Version})
Recommends: libc6-pic | libc6.1-pic
Description: Shared library reduction script
mklibs produces cut-down shared libraries that contain only the
Index: src/mklibs-copy.py
===================================================================
--- src/mklibs-copy.py (revision 108)
+++ src/mklibs-copy.py (working copy)
@@ -65,6 +65,13 @@
return result
+def elf_header(obj):
+ if not os.access(obj, os.F_OK):
+ raise "Cannot find lib: " + obj
+ output = command("mklibs-readelf", "--print-elf-header", obj)
+ s = [int(i) for i in output[0].split()]
+ return {'class': s[0], 'data': s[1], 'machine': s[2], 'flags': s[3]}
+
# Return a set of rpath strings for the passed object
def rpath(obj):
if not os.access(obj, os.F_OK):
@@ -278,6 +285,11 @@
previous_pass_libraries = libraries
+ # WORKAROUND: Always add libgcc on old-abi arm
+ header = elf_header(find_lib(libraries.copy().pop()))
+ if header['machine'] == 40 and header['flags'] & 0xff000000 == 0:
+ libraries.add('libgcc_s.so.1')
+
# reduce libraries
for library in libraries:
so_file = find_lib(library)
Index: src/mklibs-readelf/main.cpp
===================================================================
--- src/mklibs-readelf/main.cpp (revision 112)
+++ src/mklibs-readelf/main.cpp (working copy)
@@ -18,6 +18,7 @@
static struct option const long_opts[] =
{
+ {"print-elf-header", no_argument, 0, 'e'},
{"print-interp", no_argument, 0, 'i'},
{"print-needed", no_argument, 0, 'n'},
{"print-rpath", no_argument, 0, 'R'},
@@ -33,6 +34,7 @@
enum command
{
+ COMMAND_PRINT_ELF_HEADER,
COMMAND_PRINT_INTERP,
COMMAND_PRINT_NEEDED,
COMMAND_PRINT_RPATH,
@@ -41,6 +43,15 @@
COMMAND_PRINT_SYMBOLS_UNDEFINED,
};
+static void process_elf_header (Elf::file *file)
+{
+ std::cout
+ << (unsigned int) file->get_class () << ' '
+ << (unsigned int) file->get_data () << ' '
+ << file->get_machine () << ' '
+ << file->get_flags () << '\n';
+}
+
static void process_dynamics (Elf::section_type<Elf::section_type_DYNAMIC> *section, int64_t tag)
{
for (std::vector<Elf::dynamic *>::const_iterator it = section->get_dynamics ().begin (); it != section->get_dynamics ().end (); ++it)
@@ -108,6 +119,9 @@
switch (cmd)
{
+ case COMMAND_PRINT_ELF_HEADER:
+ process_elf_header (file);
+ break;
case COMMAND_PRINT_INTERP:
if (segment_interp)
std::cout << segment_interp->get_interp () << '\n';
@@ -166,12 +180,15 @@
program_name = argv[0];
- while ((c = getopt_long (argc, argv, "inpRsu", long_opts, NULL)) != -1)
+ while ((c = getopt_long (argc, argv, "einpRsu", long_opts, NULL)) != -1)
{
switch (c)
{
case 0:
break;
+ case 'e':
+ cmd = COMMAND_PRINT_ELF_HEADER;
+ break;
case 'i':
cmd = COMMAND_PRINT_INTERP;
break;
Index: src/mklibs-readelf/elf.cpp
===================================================================
--- src/mklibs-readelf/elf.cpp (revision 105)
+++ src/mklibs-readelf/elf.cpp (working copy)
@@ -150,6 +150,7 @@
this->machine = convert<_data, typeof (ehdr->e_machine )> () (ehdr->e_machine);
this->phoff = convert<_data, typeof (ehdr->e_phoff )> () (ehdr->e_phoff);
this->shoff = convert<_data, typeof (ehdr->e_shoff )> () (ehdr->e_shoff);
+ this->flags = convert<_data, typeof (ehdr->e_flags )> () (ehdr->e_flags);
this->phentsize = convert<_data, typeof (ehdr->e_phentsize)> () (ehdr->e_phentsize);
this->phnum = convert<_data, typeof (ehdr->e_phnum )> () (ehdr->e_phnum);
this->shentsize = convert<_data, typeof (ehdr->e_shentsize)> () (ehdr->e_shentsize);
Index: src/mklibs-readelf/elf.hpp
===================================================================
--- src/mklibs-readelf/elf.hpp (revision 105)
+++ src/mklibs-readelf/elf.hpp (working copy)
@@ -31,15 +31,15 @@
namespace Elf
{
- class file_class_32 { public: static const unsigned int id = 1; };
- class file_class_64 { public: static const unsigned int id = 2; };
- class file_data_2LSB { public: static const unsigned int id = 1; };
- class file_data_2MSB { public: static const unsigned int id = 2; };
+ class file_class_32 { public: static const uint8_t id = 1; };
+ class file_class_64 { public: static const uint8_t id = 2; };
+ class file_data_2LSB { public: static const uint8_t id = 1; };
+ class file_data_2MSB { public: static const uint8_t id = 2; };
class section_type_UNDEFINED { };
- class section_type_DYNAMIC { public: static const unsigned int id = 6; };
- class section_type_DYNSYM { public: static const unsigned int id = 11; };
+ class section_type_DYNAMIC { public: static const uint8_t id = 6; };
+ class section_type_DYNSYM { public: static const uint8_t id = 11; };
class segment_type_UNDEFINED { };
- class segment_type_INTERP { public: static const unsigned int id = 3; };
+ class segment_type_INTERP { public: static const uint8_t id = 3; };
class section;
class segment;
@@ -53,6 +53,7 @@
virtual const uint8_t get_data () const throw () = 0;
const uint16_t get_type () const throw () { return type; }
const uint16_t get_machine () const throw () { return machine; }
+ const uint32_t get_flags () const throw () { return flags; }
const uint16_t get_shstrndx () const throw () { return shstrndx; }
const std::vector <section *> get_sections () const throw () { return sections; };
@@ -73,6 +74,7 @@
uint16_t machine;
uint64_t phoff;
uint64_t shoff;
+ uint32_t flags;
uint16_t phentsize;
uint16_t phnum;
uint16_t shentsize;
Index: src/mklibs.py
===================================================================
--- src/mklibs.py (revision 109)
+++ src/mklibs.py (working copy)
@@ -83,6 +83,13 @@
return result
+def elf_header(obj):
+ if not os.access(obj, os.F_OK):
+ raise "Cannot find lib: " + obj
+ output = command("mklibs-readelf", "--print-elf-header", obj)
+ s = [int(i) for i in output[0].split()]
+ return {'class': s[0], 'data': s[1], 'machine': s[2], 'flags': s[3]}
+
# Return a set of rpath strings for the passed object
def rpath(obj):
if not os.access(obj, os.F_OK):
@@ -400,6 +407,11 @@
library_symbols_used = {}
symbol_provider = {}
+ # WORKAROUND: Always add libgcc on old-abi arm
+ header = elf_header(find_lib(libraries.copy().pop()))
+ if header['machine'] == 40 and header['flags'] & 0xff000000 == 0:
+ libraries.add('libgcc_s.so.1')
+
# Calculate all symbols each library provides
for library in libraries:
path = find_lib(library)
Attachment:
signature.asc
Description: Digital signature