一、前言:
最近购买一块usb砖gpio模块,需要使用其共享函数来操作IO口,但是所有的函数都封装为共享文件.so的形式,本笔记主要用于记录该文件的解析方式,以及其中的函数的一些使用方法。
1.RM1380模块:
2.共享函数库libs如下所示:
为了更加方便的使用其中的函数,需要对librockmong.so和lisbusb-1.0.so进行解析:
二、librockmong.so解析
使用命令查看其中的函数:
nm -D librockmong.so
返回结果如下:
000000000000560c T ADC_Init
00000000000056e8 T ADC_InitMulti
0000000000005676 T ADC_Read
0000000000005910 T ADC_ReadMulti
0000000000003c17 T CRC16MODBUS_Calc
000000000000a000 R CRC16MODBUS_Table
000000000000a200 R CRC8_Table
00000000000049bf T IO_InitMultiPin
00000000000054a6 T IO_InitMultiPin_Byron
00000000000047fe T IO_InitPin
0000000000004e38 T IO_ReadMultiOutputPin
0000000000004c25 T IO_ReadMultiPin
00000000000048e3 T IO_ReadOutputPin
00000000000052f6 T IO_ReadOutputPin_Bit
0000000000004871 T IO_ReadPin
00000000000053ce T IO_ReadPin_Bit
000000000000504b T IO_WriteMultiPin
0000000000005574 T IO_WriteMultiPin_Byron
0000000000004955 T IO_WritePin
000000000000525e T IO_WritePin_Bit
0000000000007751 T MISC_GetData
0000000000007486 T MISC_GetFwVersion
00000000000078c7 T MISC_GetLibraryVersion
000000000000758e T MISC_GetModel
0000000000007937 T MISC_SetPortLevel
0000000000007696 T MISC_SetSn
00000000000043c9 T MultiplesOf8
0000000000005b38 T PWM_Init
0000000000005ddf T PWM_InitMulti
0000000000005c94 T PWM_SetDuty
0000000000006545 T PWM_SetDutyMulti
0000000000005d6a T PWM_SetFrequency
0000000000006995 T PWM_SetFrequencyMulti
0000000000005cff T PWM_SetPhase
000000000000676d T PWM_SetPhaseMulti
0000000000005bc9 T PWM_Start
0000000000006139 T PWM_StartMulti
0000000000006c12 T PWM_Start_withList
0000000000005c33 T PWM_Stop
0000000000006361 T PWM_StopMulti
00000000000043ff T PlaintextLength2CiphertextLength
0000000000008175 T PwrOn_ADC
00000000000081df T PwrOn_ADC_Multi
0000000000007a83 T PwrOn_IO
0000000000007b00 T PwrOn_IO_Multi
0000000000007d8a T PwrOn_PWM
0000000000007e1b T PwrOn_PWM_Multi
00000000000079db T PwrOn_SerPortLevel
000000000000738f T UART_Clear
0000000000006f09 T UART_Init
00000000000071cc T UART_Read
0000000000007048 T UART_Write
00000000000089c3 T UsbDev_Del_CallBack
0000000000009337 T UsbDev_Transfer
0000000000009612 T UsbDevice_GetPid
0000000000009603 T UsbDevice_GetVid
0000000000008a36 T UsbDevice_Scan
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U __assert_fail@GLIBC_2.2.5
w __cxa_finalize@GLIBC_2.2.5
w __gmon_start__
U __stack_chk_fail@GLIBC_2.4
0000000000008774 T _decrypt
00000000000086c7 T _encrypt
0000000000003dc2 T _rm_list_init
0000000000008892 T _usb_dev_init
000000000000d2e0 B dbg_buf
00000000000041f4 T decrypt
000000000000404b T encrypt
0000000000004420 T frame_transfer
U free@GLIBC_2.2.5
000000000000d738 B func_libusb_bulk_transfer
000000000000d710 B func_libusb_claim_interface
000000000000d750 B func_libusb_close
000000000000d770 B func_libusb_control_transfer
000000000000d6f0 B func_libusb_detach_kernel_driver
000000000000d708 B func_libusb_exit
000000000000d760 B func_libusb_free_config_descriptor
000000000000d6f8 B func_libusb_free_device_list
000000000000d748 B func_libusb_get_config_descriptor
000000000000d740 B func_libusb_get_device_descriptor
000000000000d768 B func_libusb_get_device_list
000000000000d728 B func_libusb_init
000000000000d718 B func_libusb_kernel_driver_active
000000000000d758 B func_libusb_open
000000000000d730 B func_libusb_release_interface
000000000000d720 B func_libusb_set_auto_detach_kernel_driver
000000000000d700 B handle_libusb
U libusb_bulk_transfer
U libusb_claim_interface
U libusb_close
U libusb_control_transfer
U libusb_detach_kernel_driver
U libusb_exit
U libusb_free_config_descriptor
U libusb_free_device_list
U libusb_get_config_descriptor
U libusb_get_device_descriptor
U libusb_get_device_list
U libusb_init
U libusb_kernel_driver_active
U libusb_open
U libusb_release_interface
U libusb_set_auto_detach_kernel_driver
000000000000d1e0 B list_lock
0000000000003c86 T lw_CRC8_Calc
0000000000003b90 T lw_Convert_LSBBytesToU16
0000000000003bad T lw_Convert_LSBBytesToU32
0000000000003bc7 T lw_Convert_LSBBytesToU64
0000000000003a94 T lw_Convert_MSBBytesToU16
0000000000003ae9 T lw_Convert_MSBBytesToU32
0000000000003b3b T lw_Convert_MSBBytesToU64
0000000000003a06 T lw_Convert_U16ToLSBBytes
0000000000003945 T lw_Convert_U16ToMSBBytes
0000000000003a37 T lw_Convert_U32ToLSBBytes
0000000000003987 T lw_Convert_U32ToMSBBytes
0000000000003a65 T lw_Convert_U64ToLSBBytes
00000000000039c6 T lw_Convert_U64ToMSBBytes
00000000000037ef T lw_EndianExchange
0000000000003799 T lw_memcpy
U malloc@GLIBC_2.2.5
U memcpy@GLIBC_2.14
U memset@GLIBC_2.2.5
000000000000a300 R password
U pthread_mutex_destroy@GLIBC_2.2.5
U pthread_mutex_init@GLIBC_2.2.5
U pthread_mutex_lock@GLIBC_2.2.5
U pthread_mutex_unlock@GLIBC_2.2.5
U rand@GLIBC_2.2.5
000000000000d220 B rm_devs
0000000000003e06 T rm_list_add
0000000000003e57 T rm_list_clear
0000000000003fa4 T rm_list_get_all
0000000000003f0f T rm_list_get_handle
000000000000d2a0 B rm_lock
U sprintf@GLIBC_2.2.5
U srand@GLIBC_2.2.5
0000000000008567 T tea_decrypt
0000000000008407 T tea_encrypt
U time@GLIBC_2.2.5
查看具体的函数的用法:
objdump -D librockmong.so | grep -A10 -B10 PWM_Start
其中 -A10表示显示函数名后面10行对象的内容,-B10表示显示函数名前面20行的内容。
00001810 <PwrOn_PWM_Multi@plt>:
1810: e28fc600 add ip, pc, #0, 12
1814: e28cca17 add ip, ip, #94208 ; 0x17000
1818: e5bcf848 ldr pc, [ip, #2120]! ; 0x8480000181c <PwrOn_ADC_Multi@plt>:
181c: e28fc600 add ip, pc, #0, 12
1820: e28cca17 add ip, ip, #94208 ; 0x17000
1824: e5bcf840 ldr pc, [ip, #2112]! ; 0x84000001828 <PWM_StartMulti@plt>:
1828: e28fc600 add ip, pc, #0, 12
182c: e28cca17 add ip, ip, #94208 ; 0x17000
1830: e5bcf838 ldr pc, [ip, #2104]! ; 0x83800001834 <lw_Convert_MSBBytesToU16@plt>:
1834: e28fc600 add ip, pc, #0, 12
1838: e28cca17 add ip, ip, #94208 ; 0x17000
183c: e5bcf830 ldr pc, [ip, #2096]! ; 0x83000001840 <malloc@plt>:
--
4080: e24b1014 sub r1, fp, #20
4084: e3a03001 mov r3, #1
4088: e51b0020 ldr r0, [fp, #-32] ; 0xffffffe0
408c: ebfff612 bl 18dc <PWM_InitMulti@plt>
4090: e50b0008 str r0, [fp, #-8]
4094: e51b3008 ldr r3, [fp, #-8]
4098: e1a00003 mov r0, r3
409c: e24bd004 sub sp, fp, #4
40a0: e8bd8800 pop {fp, pc}000040a4 <PWM_Start>:
40a4: e92d4800 push {fp, lr}
40a8: e28db004 add fp, sp, #4
40ac: e24dd020 sub sp, sp, #32
40b0: e50b0018 str r0, [fp, #-24] ; 0xffffffe8
40b4: e50b101c str r1, [fp, #-28] ; 0xffffffe4
40b8: e50b2020 str r2, [fp, #-32] ; 0xffffffe0
40bc: e3a03000 mov r3, #0
40c0: e50b3008 str r3, [fp, #-8]
40c4: e51b301c ldr r3, [fp, #-28] ; 0xffffffe4
40c8: e6ef3073 uxtb r3, r3
40cc: e54b3010 strb r3, [fp, #-16]
40d0: e51b3020 ldr r3, [fp, #-32] ; 0xffffffe0
40d4: e50b300c str r3, [fp, #-12]
40d8: e24b2014 sub r2, fp, #20
40dc: e24b1010 sub r1, fp, #16
40e0: e3a03001 mov r3, #1
40e4: e51b0018 ldr r0, [fp, #-24] ; 0xffffffe8
40e8: ebfff5ce bl 1828 <PWM_StartMulti@plt>
40ec: e50b0008 str r0, [fp, #-8]
40f0: e51b3008 ldr r3, [fp, #-8]
40f4: e1a00003 mov r0, r3
40f8: e24bd004 sub sp, fp, #4
40fc: e8bd8800 pop {fp, pc}00004100 <PWM_Stop>:
4100: e92d4800 push {fp, lr}
4104: e28db004 add fp, sp, #4
4108: e24dd018 sub sp, sp, #24
--
46d0: e24bd004 sub sp, fp, #4
46d4: e8bd8800 pop {fp, pc}
46d8: 00003cec andeq r3, r0, ip, ror #25
46dc: 00003ca8 andeq r3, r0, r8, lsr #25
46e0: 00003cc0 andeq r3, r0, r0, asr #25
46e4: 00003cc0 andeq r3, r0, r0, asr #25
46e8: 00003c7c andeq r3, r0, ip, ror ip
46ec: 00003ca0 andeq r3, r0, r0, lsr #25
46f0: ffffe4a8 ; <UNDEFINED> instruction: 0xffffe4a8000046f4 <PWM_StartMulti>:
46f4: e92d4800 push {fp, lr}
46f8: e28db004 add fp, sp, #4
46fc: e24dd048 sub sp, sp, #72 ; 0x48
4700: e50b0028 str r0, [fp, #-40] ; 0xffffffd8
4704: e50b102c str r1, [fp, #-44] ; 0xffffffd4
4708: e50b2030 str r2, [fp, #-48] ; 0xffffffd0
470c: e50b3034 str r3, [fp, #-52] ; 0xffffffcc
4710: e3a03000 mov r3, #0
4714: e50b3008 str r3, [fp, #-8]
4718: e3a03000 mov r3, #0
471c: e50b3020 str r3, [fp, #-32] ; 0xffffffe0
4720: e3a03005 mov r3, #5
4724: e50b3010 str r3, [fp, #-16]
4728: e3a03001 mov r3, #1
472c: e50b3014 str r3, [fp, #-20] ; 0xffffffec
4730: e51b302c ldr r3, [fp, #-44] ; 0xffffffd4
4734: e3530000 cmp r3, #0
4738: 1a000007 bne 475c <PWM_StartMulti+0x68>
473c: e59f327c ldr r3, [pc, #636] ; 49c0 <PWM_StartMulti+0x2cc>
4740: e08f3003 add r3, pc, r3
4744: e3a020a8 mov r2, #168 ; 0xa8
4748: e59f1274 ldr r1, [pc, #628] ; 49c4 <PWM_StartMulti+0x2d0>
474c: e08f1001 add r1, pc, r1
4750: e59f0270 ldr r0, [pc, #624] ; 49c8 <PWM_StartMulti+0x2d4>
4754: e08f0000 add r0, pc, r0
4758: ebfff483 bl 196c <__assert_fail@plt>
475c: e51b3030 ldr r3, [fp, #-48] ; 0xffffffd0
4760: e3530000 cmp r3, #0
4764: 1a000007 bne 4788 <PWM_StartMulti+0x94>
4768: e59f325c ldr r3, [pc, #604] ; 49cc <PWM_StartMulti+0x2d8>
476c: e08f3003 add r3, pc, r3
4770: e3a020a9 mov r2, #169 ; 0xa9
4774: e59f1254 ldr r1, [pc, #596] ; 49d0 <PWM_StartMulti+0x2dc>
4778: e08f1001 add r1, pc, r1
477c: e59f0250 ldr r0, [pc, #592] ; 49d4 <PWM_StartMulti+0x2e0>
4780: e08f0000 add r0, pc, r0
4784: ebfff478 bl 196c <__assert_fail@plt>
4788: e51b3034 ldr r3, [fp, #-52] ; 0xffffffcc
478c: e3530000 cmp r3, #0
4790: 1a000001 bne 479c <PWM_StartMulti+0xa8>
4794: e3e03001 mvn r3, #1
4798: ea000085 b 49b4 <PWM_StartMulti+0x2c0>
479c: e51b3010 ldr r3, [fp, #-16]
47a0: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
47a4: e0030392 mul r3, r2, r3
47a8: e1a00003 mov r0, r3
47ac: ebfff423 bl 1840 <malloc@plt>
47b0: e1a03000 mov r3, r0
47b4: e50b3018 str r3, [fp, #-24] ; 0xffffffe8
47b8: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec
47bc: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
47c0: e0030392 mul r3, r2, r3
47c4: e1a00003 mov r0, r3
47c8: ebfff41c bl 1840 <malloc@plt>
47cc: e1a03000 mov r3, r0
47d0: e50b301c str r3, [fp, #-28] ; 0xffffffe4
47d4: e3a03000 mov r3, #0
47d8: e50b300c str r3, [fp, #-12]
47dc: ea00002b b 4890 <PWM_StartMulti+0x19c>
47e0: e51b300c ldr r3, [fp, #-12]
47e4: e1a03183 lsl r3, r3, #3
47e8: e51b202c ldr r2, [fp, #-44] ; 0xffffffd4
47ec: e0821003 add r1, r2, r3
47f0: e51b200c ldr r2, [fp, #-12]
47f4: e1a03002 mov r3, r2
47f8: e1a03103 lsl r3, r3, #2
47fc: e0833002 add r3, r3, r2
4800: e51b2018 ldr r2, [fp, #-24] ; 0xffffffe8
4804: e0823003 add r3, r2, r3
--
4874: e1a02c22 lsr r2, r2, #24
4878: e3a01000 mov r1, #0
487c: e1812002 orr r2, r1, r2
4880: e5c32004 strb r2, [r3, #4]
4884: e51b300c ldr r3, [fp, #-12]
4888: e2833001 add r3, r3, #1
488c: e50b300c str r3, [fp, #-12]
4890: e51b200c ldr r2, [fp, #-12]
4894: e51b3034 ldr r3, [fp, #-52] ; 0xffffffcc
4898: e1520003 cmp r2, r3
489c: baffffcf blt 47e0 <PWM_StartMulti+0xec>
48a0: e51b3010 ldr r3, [fp, #-16]
48a4: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
48a8: e0030392 mul r3, r2, r3
48ac: e1a01003 mov r1, r3
48b0: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec
48b4: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
48b8: e0030392 mul r3, r2, r3
48bc: e1a02003 mov r2, r3
48c0: e3a03ffa mov r3, #1000 ; 0x3e8
48c4: e58d3010 str r3, [sp, #16]
--
48d8: e58d3004 str r3, [sp, #4]
48dc: e58d1000 str r1, [sp]
48e0: e51b3018 ldr r3, [fp, #-24] ; 0xffffffe8
48e4: e3a02001 mov r2, #1
48e8: e3a01004 mov r1, #4
48ec: e51b0028 ldr r0, [fp, #-40] ; 0xffffffd8
48f0: ebfff3ba bl 17e0 <frame_transfer@plt>
48f4: e50b0008 str r0, [fp, #-8]
48f8: e3a03000 mov r3, #0
48fc: e50b300c str r3, [fp, #-12]
4900: ea00000a b 4930 <PWM_StartMulti+0x23c>
4904: e51b300c ldr r3, [fp, #-12]
4908: e51b201c ldr r2, [fp, #-28] ; 0xffffffe4
490c: e0822003 add r2, r2, r3
4910: e51b300c ldr r3, [fp, #-12]
4914: e51b1030 ldr r1, [fp, #-48] ; 0xffffffd0
4918: e0813003 add r3, r1, r3
491c: e5d22000 ldrb r2, [r2]
4920: e5c32000 strb r2, [r3]
4924: e51b300c ldr r3, [fp, #-12]
4928: e2833001 add r3, r3, #1
492c: e50b300c str r3, [fp, #-12]
4930: e51b200c ldr r2, [fp, #-12]
4934: e51b3034 ldr r3, [fp, #-52] ; 0xffffffcc
4938: e1520003 cmp r2, r3
493c: bafffff0 blt 4904 <PWM_StartMulti+0x210>
4940: e51b3008 ldr r3, [fp, #-8]
4944: e3530000 cmp r3, #0
4948: ba000013 blt 499c <PWM_StartMulti+0x2a8>
494c: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec
4950: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
4954: e0030392 mul r3, r2, r3
4958: e51b2020 ldr r2, [fp, #-32] ; 0xffffffe0
495c: e1530002 cmp r3, r2
4960: 0a000002 beq 4970 <PWM_StartMulti+0x27c>
4964: e59f306c ldr r3, [pc, #108] ; 49d8 <PWM_StartMulti+0x2e4>
4968: e50b3008 str r3, [fp, #-8]
496c: ea00000b b 49a0 <PWM_StartMulti+0x2ac>
4970: e3a03000 mov r3, #0
4974: e50b300c str r3, [fp, #-12]
4978: ea000002 b 4988 <PWM_StartMulti+0x294>
497c: e51b300c ldr r3, [fp, #-12]
4980: e2833001 add r3, r3, #1
4984: e50b300c str r3, [fp, #-12]
4988: e51b200c ldr r2, [fp, #-12]
498c: e51b3034 ldr r3, [fp, #-52] ; 0xffffffcc
4990: e1520003 cmp r2, r3
4994: bafffff8 blt 497c <PWM_StartMulti+0x288>
4998: ea000000 b 49a0 <PWM_StartMulti+0x2ac>
499c: e1a00000 nop ; (mov r0, r0)
49a0: e51b0018 ldr r0, [fp, #-24] ; 0xffffffe8
49a4: ebfff372 bl 1774 <free@plt>
49a8: e51b001c ldr r0, [fp, #-28] ; 0xffffffe4
49ac: ebfff370 bl 1774 <free@plt>
49b0: e51b3008 ldr r3, [fp, #-8]
49b4: e1a00003 mov r0, r3
49b8: e24bd004 sub sp, fp, #4
49bc: e8bd8800 pop {fp, pc}
49c0: 00003888 andeq r3, r0, r8, lsl #17
--
5500: 00002dec andeq r2, r0, ip, ror #27
5504: 00000179 andeq r0, r0, r9, ror r1
5508: 00002d50 andeq r2, r0, r0, asr sp
550c: 00002d68 andeq r2, r0, r8, ror #26
5510: 00002dc0 andeq r2, r0, r0, asr #27
5514: 0000017a andeq r0, r0, sl, ror r1
5518: 00002d24 andeq r2, r0, r4, lsr #26
551c: 00002d48 andeq r2, r0, r8, asr #26
5520: ffffe4a8 ; <UNDEFINED> instruction: 0xffffe4a800005524 <PWM_Start_withList>:
5524: e92d4800 push {fp, lr}
5528: e28db004 add fp, sp, #4
552c: e24dd048 sub sp, sp, #72 ; 0x48
5530: e50b0028 str r0, [fp, #-40] ; 0xffffffd8
5534: e50b102c str r1, [fp, #-44] ; 0xffffffd4
5538: e50b2030 str r2, [fp, #-48] ; 0xffffffd0
553c: e50b3034 str r3, [fp, #-52] ; 0xffffffcc
5540: e3a03000 mov r3, #0
5544: e50b3008 str r3, [fp, #-8]
5548: e3a03000 mov r3, #0
554c: e50b3020 str r3, [fp, #-32] ; 0xffffffe0
5550: e3a03009 mov r3, #9
5554: e50b3010 str r3, [fp, #-16]
5558: e3a03001 mov r3, #1
555c: e50b3014 str r3, [fp, #-20] ; 0xffffffec
5560: e51b302c ldr r3, [fp, #-44] ; 0xffffffd4
5564: e3530000 cmp r3, #0
5568: 1a000007 bne 558c <PWM_Start_withList+0x68>
556c: e59f33a0 ldr r3, [pc, #928] ; 5914 <PWM_Start_withList+0x3f0>
5570: e08f3003 add r3, pc, r3
5574: e59f239c ldr r2, [pc, #924] ; 5918 <PWM_Start_withList+0x3f4>
5578: e59f139c ldr r1, [pc, #924] ; 591c <PWM_Start_withList+0x3f8>
557c: e08f1001 add r1, pc, r1
5580: e59f0398 ldr r0, [pc, #920] ; 5920 <PWM_Start_withList+0x3fc>
5584: e08f0000 add r0, pc, r0
5588: ebfff0f7 bl 196c <__assert_fail@plt>
558c: e51b3030 ldr r3, [fp, #-48] ; 0xffffffd0
5590: e3530000 cmp r3, #0
5594: 1a000007 bne 55b8 <PWM_Start_withList+0x94>
5598: e59f3384 ldr r3, [pc, #900] ; 5924 <PWM_Start_withList+0x400>
559c: e08f3003 add r3, pc, r3
55a0: e59f2380 ldr r2, [pc, #896] ; 5928 <PWM_Start_withList+0x404>
55a4: e59f1380 ldr r1, [pc, #896] ; 592c <PWM_Start_withList+0x408>
55a8: e08f1001 add r1, pc, r1
55ac: e59f037c ldr r0, [pc, #892] ; 5930 <PWM_Start_withList+0x40c>
55b0: e08f0000 add r0, pc, r0
55b4: ebfff0ec bl 196c <__assert_fail@plt>
55b8: e51b3034 ldr r3, [fp, #-52] ; 0xffffffcc
55bc: e3530000 cmp r3, #0
55c0: 1a000001 bne 55cc <PWM_Start_withList+0xa8>
55c4: e3e03001 mvn r3, #1
55c8: ea0000ce b 5908 <PWM_Start_withList+0x3e4>
55cc: e51b3010 ldr r3, [fp, #-16]
55d0: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
55d4: e0030392 mul r3, r2, r3
55d8: e1a00003 mov r0, r3
55dc: ebfff097 bl 1840 <malloc@plt>
55e0: e1a03000 mov r3, r0
55e4: e50b3018 str r3, [fp, #-24] ; 0xffffffe8
55e8: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec
55ec: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
55f0: e0030392 mul r3, r2, r3
55f4: e1a00003 mov r0, r3
55f8: ebfff090 bl 1840 <malloc@plt>
55fc: e1a03000 mov r3, r0
5600: e50b301c str r3, [fp, #-28] ; 0xffffffe4
5604: e3a03000 mov r3, #0
5608: e50b300c str r3, [fp, #-12]
560c: ea000072 b 57dc <PWM_Start_withList+0x2b8>
5610: e51b200c ldr r2, [fp, #-12]
5614: e1a03002 mov r3, r2
5618: e1a03103 lsl r3, r3, #2
561c: e0833002 add r3, r3, r2
5620: e1a03083 lsl r3, r3, #1
5624: e1a02003 mov r2, r3
5628: e51b302c ldr r3, [fp, #-44] ; 0xffffffd4
562c: e0831002 add r1, r3, r2
5630: e51b200c ldr r2, [fp, #-12]
5634: e1a03002 mov r3, r2
--
57c0: e6ff2072 uxth r2, r2
57c4: e3a01000 mov r1, #0
57c8: e1812002 orr r2, r1, r2
57cc: e5c32008 strb r2, [r3, #8]
57d0: e51b300c ldr r3, [fp, #-12]
57d4: e2833001 add r3, r3, #1
57d8: e50b300c str r3, [fp, #-12]
57dc: e51b200c ldr r2, [fp, #-12]
57e0: e51b3034 ldr r3, [fp, #-52] ; 0xffffffcc
57e4: e1520003 cmp r2, r3
57e8: baffff88 blt 5610 <PWM_Start_withList+0xec>
57ec: e51b3010 ldr r3, [fp, #-16]
57f0: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
57f4: e0030392 mul r3, r2, r3
57f8: e1a01003 mov r1, r3
57fc: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec
5800: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
5804: e0030392 mul r3, r2, r3
5808: e1a02003 mov r2, r3
580c: e3a03ffa mov r3, #1000 ; 0x3e8
5810: e58d3010 str r3, [sp, #16]
--
5824: e58d3004 str r3, [sp, #4]
5828: e58d1000 str r1, [sp]
582c: e51b3018 ldr r3, [fp, #-24] ; 0xffffffe8
5830: e3a02006 mov r2, #6
5834: e3a01004 mov r1, #4
5838: e51b0028 ldr r0, [fp, #-40] ; 0xffffffd8
583c: ebffefe7 bl 17e0 <frame_transfer@plt>
5840: e50b0008 str r0, [fp, #-8]
5844: e3a03000 mov r3, #0
5848: e50b300c str r3, [fp, #-12]
584c: ea000008 b 5874 <PWM_Start_withList+0x350>
5850: e51b300c ldr r3, [fp, #-12]
5854: e51b2030 ldr r2, [fp, #-48] ; 0xffffffd0
5858: e0823003 add r3, r2, r3
585c: e51b2008 ldr r2, [fp, #-8]
5860: e6ef2072 uxtb r2, r2
5864: e5c32000 strb r2, [r3]
5868: e51b300c ldr r3, [fp, #-12]
586c: e2833001 add r3, r3, #1
5870: e50b300c str r3, [fp, #-12]
5874: e51b200c ldr r2, [fp, #-12]
5878: e51b3034 ldr r3, [fp, #-52] ; 0xffffffcc
587c: e1520003 cmp r2, r3
5880: bafffff2 blt 5850 <PWM_Start_withList+0x32c>
5884: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec
5888: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
588c: e0030392 mul r3, r2, r3
5890: e50b3020 str r3, [fp, #-32] ; 0xffffffe0
5894: e51b3008 ldr r3, [fp, #-8]
5898: e3530000 cmp r3, #0
589c: ba000013 blt 58f0 <PWM_Start_withList+0x3cc>
58a0: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec
58a4: e51b2034 ldr r2, [fp, #-52] ; 0xffffffcc
58a8: e0030392 mul r3, r2, r3
58ac: e51b2020 ldr r2, [fp, #-32] ; 0xffffffe0
58b0: e1530002 cmp r3, r2
58b4: 0a000002 beq 58c4 <PWM_Start_withList+0x3a0>
58b8: e59f3074 ldr r3, [pc, #116] ; 5934 <PWM_Start_withList+0x410>
58bc: e50b3008 str r3, [fp, #-8]
58c0: ea00000b b 58f4 <PWM_Start_withList+0x3d0>
58c4: e3a03000 mov r3, #0
58c8: e50b300c str r3, [fp, #-12]
58cc: ea000002 b 58dc <PWM_Start_withList+0x3b8>
58d0: e51b300c ldr r3, [fp, #-12]
58d4: e2833001 add r3, r3, #1
58d8: e50b300c str r3, [fp, #-12]
58dc: e51b200c ldr r2, [fp, #-12]
58e0: e51b3034 ldr r3, [fp, #-52] ; 0xffffffcc
58e4: e1520003 cmp r2, r3
58e8: bafffff8 blt 58d0 <PWM_Start_withList+0x3ac>
58ec: ea000000 b 58f4 <PWM_Start_withList+0x3d0>
58f0: e1a00000 nop ; (mov r0, r0)
58f4: e51b0018 ldr r0, [fp, #-24] ; 0xffffffe8
58f8: ebffef9d bl 1774 <free@plt>
58fc: e51b001c ldr r0, [fp, #-28] ; 0xffffffe4
5900: ebffef9b bl 1774 <free@plt>
5904: e51b3008 ldr r3, [fp, #-8]
5908: e1a00003 mov r0, r3
590c: e24bd004 sub sp, fp, #4
5910: e8bd8800 pop {fp, pc}
5914: 00002ab8 ; <UNDEFINED> instruction: 0x00002ab8
从其中可以看到PWM_Start函数的定义如下:
000040a4 <PWM_Start>:
40a4: e92d4800 push {fp, lr} ; 保存帧指针和链接寄存器
40a8: e28db004 add fp, sp, #4 ; 设置新的帧指针
40ac: e24dd020 sub sp, sp, #32 ; 为局部变量分配空间
40b0: e50b0018 str r0, [fp, #-24] ; 保存参数 r0
40b4: e50b101c str r1, [fp, #-28] ; 保存参数 r1
40b8: e50b2020 str r2, [fp, #-32] ; 保存参数 r2
40bc: e3a03000 mov r3, #0 ; 初始化 r3 为 0
40c0: e50b3008 str r3, [fp, #-8] ; 存储 r3 的值
40c4: e51b301c ldr r3, [fp, #-28] ; 加载 r1 的值到 r3
40c8: e6ef3073 uxtb r3, r3 ; 从 r3 提取无符号字节
40cc: e54b3010 strb r3, [fp, #-16] ; 存储处理后的 r3
40d0: e51b3020 ldr r3, [fp, #-32] ; 加载 r2 的值到 r3
40d4: e50b300c str r3, [fp, #-12] ; 存储 r3 的值
40d8: e24b2014 sub r2, fp, #20 ; 计算局部变量的地址
40dc: e24b1010 sub r1, fp, #16 ; 计算局部变量的地址
40e0: e3a03001 mov r3, #1 ; 设置 r3 为 1
40e4: e51b0018 ldr r0, [fp, #-24] ; 重新加载 r0 的值
40e8: ebfff5ce bl 1828 <PWM_StartMulti@plt> ; 调用 PWM_StartMulti 函数
40ec: e50b0008 str r0, [fp, #-8] ; 存储返回值
40f0: e51b3008 ldr r3, [fp, #-8] ; 加载返回值
40f4: e1a00003 mov r0, r3 ; 将返回值移至 r0
40f8: e24bd004 sub sp, fp, #4 ; 恢复堆栈指针
40fc: e8bd8800 pop {fp, pc} ; 恢复帧指针和返回
函数作用:PWM_Start
函数使用了三个参数(存储在 r0
, r1
, r2
寄存器中)。这些参数被保存在栈上,并且部分参数通过处理后传递给了 PWM_StartMulti
函数。PWM_Start
函数主要负责设置和启动 PWM。此函数还处理返回值,并且在函数结束时恢复寄存器和栈状态,然后返回。
三、lisbusb-1.0.so解析
查看其中的函数如下:
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U __asprintf_chk@GLIBC_2.8
U __assert_fail@GLIBC_2.2.5
U __ctype_b_loc@GLIBC_2.3
U __ctype_tolower_loc@GLIBC_2.3
w __cxa_finalize@GLIBC_2.2.5
U __errno_location@GLIBC_2.2.5
w __gmon_start__
U __isoc99_sscanf@GLIBC_2.7
U __open_2@GLIBC_2.7
U __snprintf_chk@GLIBC_2.3.4
U __sprintf_chk@GLIBC_2.3.4
U __stack_chk_fail@GLIBC_2.4
U __tls_get_addr@GLIBC_2.3
U __vsnprintf_chk@GLIBC_2.3.4
U calloc@GLIBC_2.2.5
U clock_gettime@GLIBC_2.17
U close@GLIBC_2.2.5
U closedir@GLIBC_2.2.5
U eventfd@GLIBC_2.7
U fcntl@GLIBC_2.2.5
U fputs@GLIBC_2.2.5
U free@GLIBC_2.2.5
U getenv@GLIBC_2.2.5
U ioctl@GLIBC_2.2.5
0000000000007dd0 T libusb_alloc_streams
000000000000b7a0 T libusb_alloc_transfer
0000000000008080 T libusb_attach_kernel_driver
000000000000e6f0 T libusb_bulk_transfer
000000000000bcc0 T libusb_cancel_transfer
0000000000007a30 T libusb_claim_interface
0000000000007ce0 T libusb_clear_halt
0000000000007490 T libusb_close
000000000000e490 T libusb_control_transfer
0000000000007fe0 T libusb_detach_kernel_driver
0000000000006840 T libusb_dev_mem_alloc
0000000000006880 T libusb_dev_mem_free
0000000000008d30 T libusb_error_name
000000000000cc60 T libusb_event_handler_active
000000000000cb80 T libusb_event_handling_ok
0000000000008120 T libusb_exit
0000000000009eb0 T libusb_free_bos_descriptor
0000000000009d80 T libusb_free_config_descriptor
000000000000a610 T libusb_free_container_id_descriptor
0000000000006e70 T libusb_free_device_list
000000000000dfa0 T libusb_free_pollfds
0000000000009ea0 T libusb_free_ss_endpoint_companion_descriptor
000000000000a550 T libusb_free_ss_usb_device_capability_descriptor
0000000000007ea0 T libusb_free_streams
000000000000b830 T libusb_free_transfer
000000000000a490 T libusb_free_usb_2_0_extension_descriptor
0000000000009a90 T libusb_get_active_config_descriptor
0000000000009f00 T libusb_get_bos_descriptor
0000000000006710 T libusb_get_bus_number
0000000000009b50 T libusb_get_config_descriptor
0000000000009c60 T libusb_get_config_descriptor_by_value
0000000000007840 T libusb_get_configuration
000000000000a560 T libusb_get_container_id_descriptor
0000000000006830 T libusb_get_device
0000000000006740 T libusb_get_device_address
0000000000009a40 T libusb_get_device_descriptor
0000000000006fa0 T libusb_get_device_list
0000000000006750 T libusb_get_device_speed
0000000000006c70 T libusb_get_max_iso_packet_size
0000000000006bc0 T libusb_get_max_packet_size
000000000000d0e0 T libusb_get_next_timeout
0000000000006730 T libusb_get_parent
000000000000de50 T libusb_get_pollfds
0000000000006720 T libusb_get_port_number
0000000000006af0 T libusb_get_port_numbers
0000000000006ba0 T libusb_get_port_path
0000000000009db0 T libusb_get_ss_endpoint_companion_descriptor
000000000000a4a0 T libusb_get_ss_usb_device_capability_descriptor
000000000000a620 T libusb_get_string_descriptor_ascii
000000000000a3e0 T libusb_get_usb_2_0_extension_descriptor
0000000000008e00 T libusb_get_version
000000000000d670 T libusb_handle_events
000000000000d6c0 T libusb_handle_events_completed
000000000000d710 T libusb_handle_events_locked
000000000000d660 T libusb_handle_events_timeout
000000000000d420 T libusb_handle_events_timeout_completed
00000000000068d0 T libusb_has_capability
000000000000ae50 T libusb_hotplug_deregister_callback
000000000000b2d0 T libusb_hotplug_get_user_data
000000000000afb0 T libusb_hotplug_register_callback
00000000000086e0 T libusb_init
000000000000cd40 T libusb_interrupt_event_handler
000000000000e710 T libusb_interrupt_transfer
0000000000007f40 T libusb_kernel_driver_active
000000000000ce20 T libusb_lock_event_waiters
000000000000c9f0 T libusb_lock_events
0000000000007210 T libusb_open
0000000000007390 T libusb_open_device_with_vid_pid
000000000000d050 T libusb_pollfds_handle_timeouts
0000000000006760 T libusb_ref_device
0000000000007b10 T libusb_release_interface
0000000000007d60 T libusb_reset_device
00000000000068a0 T libusb_set_auto_detach_kernel_driver
00000000000079c0 T libusb_set_configuration
00000000000083a0 T libusb_set_debug
0000000000007be0 T libusb_set_interface_alt_setting
0000000000008430 T libusb_set_log_cb
00000000000084c0 T libusb_set_option
000000000000d810 T libusb_set_pollfd_notifiers
000000000000e160 T libusb_setlocale
000000000000e230 T libusb_strerror
000000000000b900 T libusb_submit_transfer
000000000000c630 T libusb_transfer_get_stream_id
000000000000c620 T libusb_transfer_set_stream_id
000000000000c8e0 T libusb_try_lock_events
000000000000ceb0 T libusb_unlock_event_waiters
000000000000ca80 T libusb_unlock_events
0000000000006da0 T libusb_unref_device
000000000000cf40 T libusb_wait_for_event
0000000000008b60 T libusb_wrap_sys_device
U lseek@GLIBC_2.2.5
U malloc@GLIBC_2.2.5
U memcpy@GLIBC_2.14
U memmove@GLIBC_2.2.5
U mmap@GLIBC_2.2.5
U munmap@GLIBC_2.2.5
U nanosleep@GLIBC_2.2.5
U open@GLIBC_2.2.5
U opendir@GLIBC_2.2.5
U poll@GLIBC_2.2.5
U pthread_cond_broadcast@GLIBC_2.3.2
U pthread_cond_destroy@GLIBC_2.3.2
U pthread_cond_init@GLIBC_2.3.2
U pthread_cond_timedwait@GLIBC_2.3.2
U pthread_cond_wait@GLIBC_2.3.2
U pthread_condattr_destroy@GLIBC_2.2.5
U pthread_condattr_init@GLIBC_2.2.5
U pthread_condattr_setclock@GLIBC_2.3.3
U pthread_create@GLIBC_2.2.5
U pthread_getspecific@GLIBC_2.2.5
U pthread_join@GLIBC_2.2.5
U pthread_key_create@GLIBC_2.2.5
U pthread_key_delete@GLIBC_2.2.5
U pthread_mutex_destroy@GLIBC_2.2.5
U pthread_mutex_init@GLIBC_2.2.5
U pthread_mutex_lock@GLIBC_2.2.5
U pthread_mutex_trylock@GLIBC_2.2.5
U pthread_mutex_unlock@GLIBC_2.2.5
U pthread_self@GLIBC_2.2.5
U pthread_setname_np@GLIBC_2.12
U pthread_setspecific@GLIBC_2.2.5
U read@GLIBC_2.2.5
U readdir@GLIBC_2.2.5
U readlink@GLIBC_2.2.5
U realloc@GLIBC_2.2.5
U statfs@GLIBC_2.2.5
U stderr@GLIBC_2.2.5
U strchr@GLIBC_2.2.5
U strcmp@GLIBC_2.2.5
U strdup@GLIBC_2.2.5
U strlen@GLIBC_2.2.5
U strrchr@GLIBC_2.2.5
U strtol@GLIBC_2.2.5
U syscall@GLIBC_2.2.5
U timerfd_create@GLIBC_2.8
U timerfd_settime@GLIBC_2.8
U udev_device_get_action@LIBUDEV_183
U udev_device_get_devnode@LIBUDEV_183
U udev_device_get_sysname@LIBUDEV_183
U udev_device_new_from_syspath@LIBUDEV_183
U udev_device_unref@LIBUDEV_183
U udev_enumerate_add_match_property@LIBUDEV_183
U udev_enumerate_add_match_subsystem@LIBUDEV_183
U udev_enumerate_get_list_entry@LIBUDEV_183
U udev_enumerate_new@LIBUDEV_183
U udev_enumerate_scan_devices@LIBUDEV_183
U udev_enumerate_unref@LIBUDEV_183
U udev_list_entry_get_name@LIBUDEV_183
U udev_list_entry_get_next@LIBUDEV_183
U udev_monitor_enable_receiving@LIBUDEV_183
U udev_monitor_filter_add_match_subsystem_devtype@LIBUDEV_183
U udev_monitor_get_fd@LIBUDEV_183
U udev_monitor_new_from_netlink@LIBUDEV_183
U udev_monitor_receive_device@LIBUDEV_183
U udev_monitor_unref@LIBUDEV_183
U udev_new@LIBUDEV_183
U udev_unref@LIBUDEV_183
U uname@GLIBC_2.2.5
U write@GLIBC_2.2.5
解析方式和librockmong.so中函数的解析方式一致。