otool и файл не могут показать архитектуру файла .a

Я создал несколько статических библиотек для ARM7 с помощью cMake. Обычно, когда вы используете следующую команду для файла .a, она показывает архитектуры:

f.e.

mac:libs User$ file ./libcurl.a 
./libcurl.a: Mach-O universal binary with 3 architectures
./libcurl.a (for architecture armv6):   current ar archive random library
./libcurl.a (for architecture armv7):   current ar archive random library
./libcurl.a (for architecture i386):    current ar archive random library

or f.e.

mac:libs User$ otool -vf ./libboost_regex.a 
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture armv6
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V6
    capabilities 0x0
    offset 68
    size 9550024
    align 2^2 (4)
architecture armv7
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 9550092
    size 9390544
    align 2^2 (4)
architecture i386
    cputype CPU_TYPE_I386
    cpusubtype CPU_SUBTYPE_I386_ALL
    capabilities 0x0
    offset 18940636
    size 9595040
    align 2^2 (4)

но теперь, когда я создаю свою библиотеку, «otool» и «file» не могут показать ее архитектуру.

mac:libs User$ otool -vf ./mylib_meta.a 
Archive : ./mylib_meta.a

Что это значит? Какие ошибки я могу сделать при создании моей библиотеки?

Обновление: Игорь, спасибо!

Я извлек объектный файл с помощью команд:

ar -t mylib.a

ar -xv mylib.a myobj.o

-t показывает список двоичных файлов

-xv извлекает конкретный двоичный файл


person BergP    schedule 04.07.2013    source источник


Ответы (2)


Apple использует две формы архивов AR. Первый очень похож на традиционный архив Unix («архив a.out») — в основном просто набор файлов .o, склеенных вместе с индексом символов впереди:

"<!arch>\n"

header 0
SYMDEF entry

header 1
object 1

header 2
object 2

...

Чтобы определить архитектуру, для которой предназначен этот архив, вам потребуется извлечь хотя бы один объектный файл и использовать для него file или otool. В самом заголовке архива этой информации нет. (На самом деле, объектные файлы не обязательно все для одной и той же арки, и теоретически у вас могут быть любые файлы, а не только объекты, но это маловероятно.) Вы можете использовать ar для извлечения отдельных файлов из архива.

Другой вид — собственное изобретение Apple. Они взяли концепцию «толстый двоичный/универсальный двоичный файл», используемую для исполняемых файлов Mach-O с несколькими архитектурами, и использовали ее для архивов. Итак, "толстый" архив выглядит так:

  Fat Mach-O header
  Architecture 1 header --+
  Architecture 2 header --|--+
  Architecture 3 header --|--|--+
  [padding]               |  |  |
  Archive 1 <-------------+  |  |
  Archive 2 <----------------+  |
  Archive 3 <-------------------+

В этом случае file и otool могут просмотреть толстый заголовок и указать, какие архитектуры поддерживаются.

Для создания или редактирования толстых файлов (как архивов, так и исполняемых файлов) вы можете использовать файл lipo инструмент.

person Igor Skochinsky    schedule 04.07.2013

Одной из альтернатив является использование objdump из пакета GNU binutils (доступного, например, через homebrew). В macOS он переименован в gobjdump. Вызов его в архиве отобразит информацию о заголовке архива, возможно, избавив от необходимости извлечения объектных файлов (как вы изначально хотели)

> gobjdump -a ./libboost_regex.a
In archive ./libboost_regex.a:
c_regex_traits.o:     file format mach-o-x86-64
rw-r--r-- 502/20 140976 Nov  8 08:03 2018 c_regex_traits.o
cpp_regex_traits.o:     file format mach-o-x86-64
rw-r--r-- 502/20 106424 Nov  8 08:03 2018 cpp_regex_traits.o
...

Поздний ответ, но добавление здесь для дальнейшего использования.

person wardw    schedule 13.01.2019