# How to select architecture using idalib?

**URL:** <https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174>\
**Category:** C++ SDK & IDAPython\
**Tags:** idapython\
**Created:** [February 19, 2025, 7:16am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174 "2025-02-19T07:16:00Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [February 19, 2025, 7:16am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/1 "2025-02-19T07:16:00Z")

</div>

I want to analysis a Universal macOS Binary, it’s include a multi-arch binary (x64 & ARM), and when I use idalib in python, it’s cannot be select arch manually.

e.g.

```python
import idapro
# copy /System/Applications/Books.app/Contents/MacOS/Books to ./Books
idapro.open_database("./Books", run_auto_analysis=True)
idaapi.auto_wait()
# do something here
idapro.close_database(save=False)

```

---

<div class="post-metadata">

**Author:** ![igor](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/igor/32/35_2.png) [@igor](https://community.hex-rays.com/u/igor)\
**Post date:** [February 19, 2025, 9:03pm UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/2 "2025-02-19T21:03:04Z")

</div>

I believe for 9.0 you’ll have to pre-process the binary with `lipo` to extract the necessary slice. In 9.1 we’ll add a possibility to pass IDA-compatible [command-line arguments](https://docs.hex-rays.com/user-guide/configuration/command-line-switches) to `open_database()`, so you’ll be able to specify `-parm` or `-ppc`, which should influence the default slice selection.

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [February 20, 2025, 6:09am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/3 "2025-02-20T06:09:46Z")

</div>

Thank you for your quick response!

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [March 13, 2025, 5:29am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/4 "2025-03-13T05:29:00Z")

</div>

Hi, when I use `-TFat Mach-O File, 2`:

```auto
idapro.open_database("./Books", True, '-TFat Mach-O File, 2')

```

an error occurs:

```auto
Unknown switch '-T' -> OK

```

idalib’s args seems not same with ida/idat?

---

<div class="post-metadata">

**Author:** ![Morgan](https://avatars.discourse-cdn.com/v4/letter/m/0ea827/32.png) [@Morgan](https://community.hex-rays.com/u/Morgan)\
**Post date:** [March 13, 2025, 10:45am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/5 "2025-03-13T10:45:26Z")

</div>

Above response says to use -p, not -T?

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [March 13, 2025, 12:20pm UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/6 "2025-03-13T12:20:25Z")

</div>

-p means processor type (e.g. -parm:armv7a), I think it’s not solution to select File Format 🧐

it’s a official image:

 ![](https://us1.discourse-cdn.com/flex002/uploads/rays_hex/original/1X/b38d8de8e73f3d6699da0bc4d1a3a96aabfcc5b5.png)

---

<div class="post-metadata">

**Author:** ![igor](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/igor/32/35_2.png) [@igor](https://community.hex-rays.com/u/igor)\
**Post date:** [March 13, 2025, 12:57pm UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/7 "2025-03-13T12:57:08Z")

</div>

Actually, `-p` should help with fat Mach-O because the loader pre-selects the slice matching the current processor.

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [March 13, 2025, 2:43pm UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/8 "2025-03-13T14:43:11Z")

</div>

as you say, if I set args `-parm`, idalib seems not correctly to analysis. Additionally, we can see log message:

```auto
Format 'Fat Mach-O file, 1. X86_64 (metapc)' is not compatible with the selected processor ('arm'), disassembly might be erroneous

```

---

<div class="post-metadata">

**Author:** ![igor](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/igor/32/35_2.png) [@igor](https://community.hex-rays.com/u/igor)\
**Post date:** [March 14, 2025, 10:11am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/9 "2025-03-14T10:11:12Z")

</div>

Thanks for checking. It seems we still have some things to fix…

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [September 8, 2025, 10:03am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/10 "2025-09-08T10:03:55Z")

</div>

> [@Mas0n](#):
>
> `Fat Mach-O File, 2`

Hi, has any update on this issue?

---

<div class="post-metadata">

**Author:** ![igor](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/igor/32/35_2.png) [@igor](https://community.hex-rays.com/u/igor)\
**Post date:** [September 8, 2025, 10:06am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/11 "2025-09-08T10:06:37Z")

</div>

Hi, AFAIK `-T` should be supported starting 9.1 (and in any case, in 9.2).

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [September 8, 2025, 10:26am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/12 "2025-09-08T10:26:04Z")

</div>

Yes, but in my test case it’s seems cannot works…

```python
#!/usr/bin/env python3
"""
Database exploration example for IDA Domain API.

This example demonstrates how to open an IDA database and explore its basic properties.
"""

import argparse
from dataclasses import asdict

import ida_domain
from ida_domain import Database
from ida_domain.database import IdaCommandOptions

def explore_database(db_path):
    """Explore basic database information."""
    ida_options = IdaCommandOptions(auto_analysis=True, new_database=True, file_type='Fat Mach-O file, 2')
    with Database.open(db_path, ida_options) as db:
        # Get basic information
        print(f'Address range: {hex(db.minimum_ea)} - {hex(db.maximum_ea)}')
    
        # Get metadata
        print('Database metadata:')
        metadata_dict = asdict(db.metadata)
        for key, value in metadata_dict.items():
            print(f' {key}: {value}')

        # Count functions
        function_count = 0
        for _ in db.functions:
            function_count += 1
        print(f'Total functions: {function_count}')

def main():
    """Main entry point with argument parsing."""
    parser = argparse.ArgumentParser(description='Database exploration example')
    parser.add_argument(
        '-f', '--input-file', help='Binary input file to be loaded', type=str, required=True
    )
    args = parser.parse_args()
    explore_database(args.input_file)

if __name__ == ' __main__':
    from dotenv import load_dotenv
    load_dotenv()
    main()

```

a minimal PoC:

```python
    import idapro
    import idaapi
    
    idapro.open_database('/System/Applications/Books.app/Contents/MacOS/Books', run_auto_analysis=True, args="-TFat Mach-O file, 2")
    idaapi.auto_wait()
    idapro.close_database(save=False)

```

---

<div class="post-metadata">

**Author:** ![igor](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/igor/32/35_2.png) [@igor](https://community.hex-rays.com/u/igor)\
**Post date:** [September 8, 2025, 10:35am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/13 "2025-09-08T10:35:47Z")

</div>

I can’t test it right now, but I wonder if it’s a problem of the space in the format name. Maybe try like this:

`args='-T"Fat Mach-O file, 2"'`

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [September 9, 2025, 1:26am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/14 "2025-09-09T01:26:33Z")

</div>

still cannot works ☹

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [September 9, 2025, 1:29am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/15 "2025-09-09T01:29:15Z")

</div>

It’s confusing to me, it’s works well when I use command line:

```bash
/Applications/IDA\ Professional\ 9.2.app/Contents/MacOS/ida "-TFat Mach-O File, 2" '/System/Applications/Books.app/Contents/MacOS/Books'

```

---

<div class="post-metadata">

**Author:** ![igor](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/igor/32/35_2.png) [@igor](https://community.hex-rays.com/u/igor)\
**Post date:** [September 9, 2025, 12:11pm UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/16 "2025-09-09T12:11:17Z")

</div>

it seems apostrophes work:

```auto
idapro.open_database(‘/System/Applications/Books.app/Contents/MacOS/Books’, run_auto_analysis=True, args=“‘-TFat Mach-O file, 2’ -ot.i64”)

```

I added `-o` because the original location is not writeable.

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [September 10, 2025, 1:54am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/17 "2025-09-10T01:54:07Z")

</div>

> [@igor](#):
>
> `‘`

it’s cannot works for me…

here my test case

```python
import idapro
import idaapi

idapro.open_database('/System/Applications/Books.app/Contents/MacOS/Books', run_auto_analysis=True, args="'-TFat Mach-O file, 2' -oa.i64")
idaapi.auto_wait()
idapro.close_database(save=False)

```

there is no output in terminal…

but it’s works well if I remove `-T`.

---

<div class="post-metadata">

**Author:** ![igor](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/igor/32/35_2.png) [@igor](https://community.hex-rays.com/u/igor)\
**Post date:** [September 10, 2025, 12:11pm UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/18 "2025-09-10T12:11:54Z")

</div>

> [@Mas0n](#):
>
> there is no output in terminal…

to see analysis messages you need to call `idapro.enable_console_messages(True)`, and/or add `-Llogfile.txt` to the commandline options to copy them to a file.

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [September 11, 2025, 1:51am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/19 "2025-09-11T01:51:57Z")

</div>

> [@Mas0n](#):
>
> `"'-TFat Mach-O file, 2' -oa.i64"`

```python
import idapro
import idaapi

idapro.enable_console_messages(True)
idapro.open_database('/System/Applications/Books.app/Contents/MacOS/Books', run_auto_analysis=True, args='"-TFat Mach-O file, 2" -oa.i64')

idaapi.auto_wait()
idapro.close_database(save=False)

```

```auto
Possible file format: Fat Mach-O file, 1. X86_64 (/Applications/IDA Professional 9.1.app/Contents/MacOS/loaders/macho.dylib)
Possible file format: Fat Mach-O file, 2. ARM64 (/Applications/IDA Professional 9.1.app/Contents/MacOS/loaders/macho.dylib)

  bytes pages size description
--------- ----- ---- --------------------------------------------
  1327104 162 8192 allocating memory for b-tree...
  1327104 162 8192 allocating memory for virtual array...
   262144 32 8192 allocating memory for name pointers...
-----------------------------------------------------------------
  2916352 total memory allocated

Unknown switch '-T' -> OK

```

it’s seems cannot process `-T`

and moreever, I cannot use `idapro` in 9.2:

```python
import os
os.environ['IDADIR'] = '/Applications/IDA Professional 9.2.app/Contents/MacOS'

import idapro
import idaapi

```

log:

```auto
Import failed: dlopen(/Applications/IDA Professional 9.2.app/Contents/MacOS/python/lib-dynload/_ida_pro.so, 0x0002): symbol not found in flat namespace '_bitcountr_zero'. Current sys.path:
        /Applications/IDA Professional 9.2.app/Contents/MacOS/python
        /Applications/IDA Professional 9.2.app/Contents/MacOS/python/lib-dynload
        ...
        /Applications/IDA Professional 9.2.app/Contents/MacOS/python
Traceback (most recent call last):
  File "xxx", line 5, in <module>
    import idapro
  File "xxx/.venv/lib/python3.12/site-packages/idapro/ __init__.py", line 75, in <module>
    raise ImportError(f"Failed to initialize IDA library, {error_description}, check logging for additional information\n")
ImportError: Failed to initialize IDA library, exception <_FuncPtr object at 0x100605a90> returned a result with an exception set, check logging for additional information

```

---

<div class="post-metadata">

**Author:** ![Mas0n](https://sea2.discourse-cdn.com/flex002/user_avatar/community.hex-rays.com/mas0n/32/32_2.png) [@Mas0n](https://community.hex-rays.com/u/Mas0n)\
**Post date:** [September 11, 2025, 2:42am UTC](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174/20 "2025-09-11T02:42:47Z")

</div>

it’s works when I use ida python (/opt/homebrew/Cellar/python@3.13/3.13.5/Frameworks/Python.framework/Versions/3.13/bin/python)

```auto
$ /Applications/IDA\ Professional\ 9.2.app/Contents/MacOS/idapyswitch
The following Python installations were found:
    #0: 3.13.0 ('') (/opt/homebrew/Cellar/python@3.13/3.13.5/Frameworks/Python.framework/Versions/3.13/Python)
    #1: 3.12.0 ('') (/opt/homebrew/Cellar/python@3.12/3.12.7_1/Frameworks/Python.framework/Versions/3.12/Python)
    #2: 3.9.0 ('') (/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Python3)
    #3: 3.9.0 ('') (/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/Python3)
Please pick a number between 0 and 3 (default: 0) 
$ /opt/homebrew/Cellar/python@3.13/3.13.5/Frameworks/Python.framework/Versions/3.13/bin/python3 test.py
...
OBJC: Identified Objective-C runtime version >= 2.0
Auto analysis completed
ida_ida.inf_get_procname()='ARM'
...

```

```python
import os
import sys
os.environ['IDADIR'] = '/Applications/IDA Professional 9.2.app/Contents/MacOS'

sys.path.append(os.path.join(os.environ['IDADIR'], 'python'))
sys.path.append(os.path.join(os.environ['IDADIR'], 'idalib/python'))

import idapro
import idaapi
import ida_ida

idapro.enable_console_messages(True)
idapro.open_database('/Users/mason/Downloads/osinstallersetupd', run_auto_analysis=True, args='"-TFat Mach-O file, 2"')
print(f'{ida_ida.inf_get_procname()=}')
idaapi.auto_wait()
idapro.close_database(save=False)

```

but it’s cannot works for any version for normal python

```auto
$ uv venv --python 3.13
...
$ source .venv/bin/activate
$ python test.py
Import failed: dlopen(/Applications/IDA Professional 9.2.app/Contents/MacOS/python/lib-dynload/_ida_pro.so, 0x0002): symbol not found in flat namespace '_bitcountr_zero'. Current sys.path:
        /Applications/IDA Professional 9.2.app/Contents/MacOS/python
        /Applications/IDA Professional 9.2.app/Contents/MacOS/python/lib-dynload
        ...
        /Applications/IDA Professional 9.2.app/Contents/MacOS/python
Traceback (most recent call last):
  File "/Applications/IDA Professional 9.2.app/Contents/MacOS/python/init.py", line 53, in <module>
    globals()[f"ida_{mod}"] = __import__ (f"ida_{mod}")
                              ~~~~~~~~~~ ^^^^^^^^^^^^^^
  File "/Applications/IDA Professional 9.2.app/Contents/MacOS/python/ida_hexrays.py", line 105, in <module>
    import ida_pro
  File "/Applications/IDA Professional 9.2.app/Contents/MacOS/python/ida_pro.py", line 20, in <module>
    import _ida_pro
ImportError: dlopen(/Applications/IDA Professional 9.2.app/Contents/MacOS/python/lib-dynload/_ida_pro.so, 0x0002): symbol not found in flat namespace '_bitcountr_zero'

```

```auto
Traceback (most recent call last):
  File "test.py", line 10, in <module>
    import idaapi
  File "/Applications/IDA Professional 9.2.app/Contents/MacOS/python/idaapi.py", line 5, in <module>
    from ida_hexrays import *
  File "/Applications/IDA Professional 9.2.app/Contents/MacOS/python/ida_hexrays.py", line 105, in <module>
    import ida_pro
  File "/Applications/IDA Professional 9.2.app/Contents/MacOS/python/ida_pro.py", line 20, in <module>
    import _ida_pro
ImportError: dlopen(/Applications/IDA Professional 9.2.app/Contents/MacOS/python/lib-dynload/_ida_pro.so, 0x0002): symbol not found in flat namespace '_bitcountr_zero'

```

[Next page](https://community.hex-rays.com/t/how-to-select-architecture-using-idalib/174.md?page=2)
