Yes you can do this with LLDB. If you load a binary and dump its symbol table, 
you will see the information you want. For symbols that are lazily bound, you 
can look for "Trampoline" symbols:

cd lldb/test/lang/objc/foundation
make
lldb a.out
(lldb) target modules dump symtab a.out 
Symtab, file = .../lldb/test/lang/objc/foundation/a.out, num_symbols = 54:
               Debug symbol
               |Synthetic symbol
               ||Externally Visible
               |||
Index   UserID DSX Type         File Address/Value Load Address       Size      
         Flags      Name
------- ------ --- ------------ ------------------ ------------------ 
------------------ ---------- ----------------------------------
[    0]      0 D   SourceFile   0x0000000000000000                    Sibling 
-> [   15] 0x00640000 
/Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/main.m
[    1]      2 D   ObjectFile   0x000000004f79f1ca                    
0x0000000000000000 0x00660001 
/Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/main.o
[    2]      4 D   Code         0x00000001000010f0                    
0x00000000000000c0 0x000e0000 -[MyString initWithNSString:]
[    3]      8 D   Code         0x00000001000011b0                    
0x0000000000000090 0x000e0000 -[MyString dealloc]
[    4]     12 D   Code         0x0000000100001240                    
0x00000000000000a0 0x000e0000 -[MyString description]
[    5]     16 D   Code         0x00000001000012e0                    
0x0000000000000020 0x000e0000 -[MyString descriptionPauses]
[    6]     20 D   Code         0x0000000100001300                    
0x0000000000000030 0x000e0000 -[MyString setDescriptionPauses:]
[    7]     24 D   Code         0x0000000100001330                    
0x0000000000000030 0x000e0000 -[MyString str_property]
[    8]     28 D   Code         0x0000000100001360                    
0x0000000000000050 0x000e0000 -[MyString setStr_property:]
[    9]     32 D   Code         0x00000001000013b0                    
0x0000000000000040 0x000f0000 Test_Selector
[   10]     36 D   Code         0x00000001000013f0                    
0x0000000000000130 0x000f0000 Test_NSString
[   11]     40 D   Code         0x0000000100001520                    
0x0000000000000120 0x000f0000 Test_MyString
[   12]     44 D   Code         0x0000000100001640                    
0x00000000000001b0 0x000f0000 Test_NSArray
[   13]     48 D   Code         0x00000001000017f0                    
0x00000000000000e1 0x000f0000 main
[   14]     56 D X Data         0x0000000100002680                    
0x0000000000000000 0x00200000 my_global_str
[   15]     58 D   SourceFile   0x0000000000000000                    Sibling 
-> [   19] 0x00640000 
/Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/my-base.m
[   16]     60 D   ObjectFile   0x000000004f79f1ca                    
0x0000000000000000 0x00660001 
/Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/my-base.o
[   17]     62 D   Code         0x00000001000018e0                    
0x0000000000000020 0x000e0000 -[MyBase propertyMovesThings]
[   18]     66 D   Code         0x0000000100001900                    
0x000000000000001f 0x000e0000 -[MyBase setPropertyMovesThings:]
[   19]     82     Data         0x0000000100002000                    
0x0000000000000460 0x000e0000 pvars
[   20]     83     ObjCIVar     0x0000000100002518                    
0x0000000000000148 0x001e0000 MyBase.propertyMovesThings
[   21]     84   X Data         0x0000000100002660                    
0x0000000000000008 0x000f0000 NXArgc
[   22]     85   X Data         0x0000000100002668                    
0x0000000000000008 0x000f0000 NXArgv
[   23]     86   X ObjCClass    0x00000001000024d8                    
0x0000000000000028 0x000f0000 MyBase
[   24]     87   X ObjCClass    0x0000000100002460                    
0x0000000000000028 0x000f0000 MyString
[   25]     88   X ObjCIVar     0x0000000100002510                    
0x0000000000000008 0x000f0000 MyString._desc_pauses
[   26]     89   X ObjCIVar     0x0000000100002508                    
0x0000000000000008 0x000f0000 MyString.date
[   27]     90   X ObjCIVar     0x0000000100002500                    
0x0000000000000008 0x000f0000 MyString.str
[   28]     91   X ObjCMetaClass 0x00000001000024b0                    
0x0000000000000028 0x000f0000 MyBase
[   29]     92   X ObjCMetaClass 0x0000000100002488                    
0x0000000000000028 0x000f0000 MyString
[   30]     97   X Data         0x0000000100002678                    
0x0000000000000008 0x000f0000 __progname
[   31]     98   X Data         0x0000000100000000                    
0x00000000000010b0 0x000f0010 _mh_execute_header
[   32]     99   X Data         0x0000000100002670                    
0x0000000000000008 0x000f0000 environ
[   33]    101   X Data         0x0000000100002680                    
0x0000000000000000 0x000f0000 my_global_str
[   34]    102   X Code         0x00000001000010b0                    
0x0000000000000040 0x000f0000 start
[   35]    103     Trampoline   0x0000000100001938                    
0x0000000000000006 0x00010200 NSLog
[   36]    104   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010400 OBJC_CLASS_$_NSArray
[   37]    105   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010200 OBJC_CLASS_$_NSAutoreleasePool
[   38]    106   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010400 OBJC_CLASS_$_NSDate
[   39]    107   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010400 OBJC_CLASS_$_NSObject
[   40]    108   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010200 OBJC_CLASS_$_NSString
[   41]    109   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010400 OBJC_METACLASS_$_NSObject
[   42]    110   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010400 __CFConstantStringClassReference
[   43]    111   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010100 _objc_empty_cache
[   44]    112   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010100 _objc_empty_vtable
[   45]    113     Trampoline   0x000000010000193e                    
0x0000000000000006 0x00010300 exit
[   46]    114     Trampoline   0x0000000100001920                    
0x0000000000000006 0x00010100 objc_getProperty
[   47]    115     Trampoline   0x0000000100001926                    
0x0000000000000006 0x00010100 objc_msgSend
[   48]    116     Trampoline   0x000000010000192c                    
0x0000000000000006 0x00010100 objc_msgSendSuper2
[   49]    117   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010100 objc_msgSend_fixup
[   50]    118     Trampoline   0x0000000100001932                    
0x0000000000000006 0x00010100 objc_setProperty
[   51]    119     Trampoline   0x0000000100001944                    
0x0000000000000006 0x00010300 printf
[   52]    120     Trampoline   0x000000010000194a                    
0x0000000000000006 0x00010300 usleep
[   53]    121   X Undefined    0x0000000000000000                    
0x0000000000000000 0x00010300 dyld_stub_binder
(lldb) 


All lazily bound symbols will have type Trampoline:

[   45]    113     Trampoline   0x000000010000193e                    
0x0000000000000006 0x00010300 exit
[   46]    114     Trampoline   0x0000000100001920                    
0x0000000000000006 0x00010100 objc_getProperty
[   47]    115     Trampoline   0x0000000100001926                    
0x0000000000000006 0x00010100 objc_msgSend
[   48]    116     Trampoline   0x000000010000192c                    
0x0000000000000006 0x00010100 objc_msgSendSuper2
[   50]    118     Trampoline   0x0000000100001932                    
0x0000000000000006 0x00010100 objc_setProperty
[   51]    119     Trampoline   0x0000000100001944                    
0x0000000000000006 0x00010300 printf
[   52]    120     Trampoline   0x000000010000194a                    
0x0000000000000006 0x00010300 usleep

The other symbols that are exernal are marked with an "X" (which is a boolean 
flag on each symbol).

The symbols can be accessed via the SBModule:

    size_t
    SBModule::GetNumSymbols ();
    
    lldb::SBSymbol
    SBModule::GetSymbolAtIndex (size_t idx);

And then you can get the symbol type from each SBSymbol:

    SymbolType
    SBSymbol::GetType ();


I just added the ability to see if a symbol is externally visible:
% svn commit
Sending        include/lldb/API/SBSymbol.h
Sending        scripts/Python/interface/SBSymbol.i
Sending        source/API/SBSymbol.cpp
Transmitting file data ...
Committed revision 153893.


    bool
    SBSymbol::IsExternal();


So your flow should be:

SBDebugger::Initialize();
SBDebugger debugger(SBDebugger::Create());
SBTarget target (debugger.CreateTarget (const char *filename,
                                        const char *target_triple,
                                        const char *platform_name,
                                        bool add_dependent_modules,
                                        lldb::SBError& error));

SBFileSpec exe_file_spec (filename);
SBModule exe_module (target.FindModule(exe_file_spec));
if (exe_module.IsValid()
{
    const size_t num_symbols = exe_module. GetNumSymbols();
    for (size_t i=0; i<num_symbols; ++i)
    {
        SBSymbol symbol (exe_module. GetSymbolAtIndex(i));
        if (symbol.IsExternal())
        {
        }

        if (symbol.GetType() == lldb::eSymbolTypeTrampoline)
        {
        }
    }
}




On Mar 31, 2012, at 11:02 PM, Jason E. Aten wrote:

> Dear LLDB enthusiasts,
> 
> I'm wondering if I can use the lldb library/libraries to replace the certain 
> code running on OSX that now returns two lists of symbols-- similar to the 
> output of (dyldinfo -lazy_bind -exports <bundlefile>); i.e. I need to list 
> the symbols imported and exported by a binary shared object or bundle.
> 
> My hope was that by using an lldb library, I would be able to use the same 
> client code on OSX as on linux. (The linux version of the code currently uses 
> libbfd and libdld to do the same thing, but the later is getting little 
> love/maintenance).
> 
> I'm looking through include/lldb/, as it seems like lldb would need this same 
> info (imported symbol list, and exported symbol list for a Mach-O file) to 
> function, but it's not clear which API to use.  All suggestions/pointers to 
> example code in lldb would be welcome!
> 
> Thank you.
> Jason
> 
> # In case it is unclear what dyldinfo does, here is an example: (but I only 
> need the symbol names; not the addresses or segments or sections):
> 
> $ file /tmp/sample_bundle 
> /tmp/sample_bundle: Mach-O 64-bit bundle x86_64
> 
> $dyldinfo -lazy_bind -export /tmp/sample_bundle 
> 
> lazy binding information (from lazy_bind part of dyld info):
> segment section          address    index  dylib            symbol
> __DATA  __la_symbol_ptr  0x00001030 0x0000 flat-namespace   __mm_pop_chunk
> __DATA  __la_symbol_ptr  0x00001038 0x0015 flat-namespace   _dh_define
> export information (from trie):
> 0x000008A0  _C_ipair
> 0x00000920  _init_ipair
> 0x00000BC0  _C_iprot
> 0x00000C40  _C_ipi2
> 0x00000CC0  _C_ipi1
> 0x00001040  _K_ipair_R43808f40
> 0x00001160  _K_ipi1_R5cb4475d
> 0x00001260  _K_ipi2_R5cb4475d
> 0x00001360  _K_iprot_Rfc8fe739
> 0x00001460  _majver_ipair
> 0x00001464  _minver_ipair
> 
> 
> _______________________________________________
> lldb-dev mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to