def test_compile_native_objects(self): s = self.getFakeSourceFile() with self.getTemp(suffix='.o') as obj: # TODO(dschuff): Use something more descriptive instead of -arch # (i.e. something that indicates that a translation is requested) # and remove pnacl-allow-translate driver_tools.RunDriver('clang', [ s.name, '-c', '-o', obj.name, '--target=x86_64-unknown-nacl', '-arch', 'x86-64', '--pnacl-allow-translate' ]) self.assertTrue(filetype.IsNativeObject(obj.name)) self.assertEqual(elftools.GetELFHeader(obj.name).arch, 'X8664') driver_tools.RunDriver('clang', [ s.name, '-c', '-o', obj.name, '--target=i686-unknown-nacl', '-arch', 'x86-32', '--pnacl-allow-translate' ]) self.assertTrue(filetype.IsNativeObject(obj.name)) self.assertEqual(elftools.GetELFHeader(obj.name).arch, 'X8632') driver_tools.RunDriver('clang', [ s.name, '-c', '-o', obj.name, '--target=armv7-unknown-nacl-gnueabi', '-arch', 'arm', '--pnacl-allow-translate' ]) self.assertTrue(filetype.IsNativeObject(obj.name)) self.assertEqual(elftools.GetELFHeader(obj.name).arch, 'ARM') # TODO(dschuff): This should be an error. driver_tools.RunDriver('clang', [ s.name, '-c', '-o', obj.name, '--target=x86_64-unknown-nacl', '-arch', 'x86-32', '--pnacl-allow-translate' ]) self.assertTrue(filetype.IsNativeObject(obj.name)) self.assertEqual(elftools.GetELFHeader(obj.name).arch, 'X8632')
def ArchMerge(filename, must_match): file_type = filetype.FileType(filename) if file_type in ('o','so'): elfheader = elftools.GetELFHeader(filename) if not elfheader: Log.Fatal("%s: Cannot read ELF header", filename) new_arch = elfheader.arch elif filetype.IsNativeArchive(filename): new_arch = file_type[len('archive-'):] else: Log.Fatal('%s: Unexpected file type in ArchMerge', filename) existing_arch = GetArch() if not existing_arch: SetArch(new_arch) return True elif new_arch != existing_arch: if must_match: msg = "%s: Incompatible object file (%s != %s)" logfunc = Log.Fatal else: msg = "%s: Skipping incompatible object file (%s != %s)" logfunc = Log.Warning logfunc(msg, filename, new_arch, existing_arch) return False else: # existing_arch and new_arch == existing_arch return True
def GetELFType(filename): """ ELF type as determined by ELF metadata """ assert(elftools.IsELF(filename)) elfheader = elftools.GetELFHeader(filename) elf_type_map = { 'EXEC': 'nexe', 'REL' : 'o', 'DYN' : 'so' } return elf_type_map[elfheader.type]