我先简单描述下我的问题,一个arm库,定义了一个c++函数,他有3个参数,第一个是this指针。
调用他的时候,按理说肯定要传3个参数,分别传给r0,r1,r2。
可是在分析了调用代码发现,调用这个函数时,只传了2个参数
参数1this没有传
参数2本来应该放入r1,他却放入了r0
参数3本来应该放入r2,他却放入了r1
怪事,求解释。。。
下面是代码片段
这是so库中定义的函数createListenServer,他的第一个参数是this,加了一个__hidden限定符?会不会和__hidden有关?
.text:0008C528 ; _DWORD __fastcall tsd::common::ipc::createListenServer(tsd::common::ipc *__hidden this, const char *, unsigned int)
.text:0008C528 EXPORT _ZN3tsd6common3ipc18createListenServerEPKcj
.text:0008C528 _ZN3tsd6common3ipc18createListenServerEPKcj
.text:0008C528 MOV R12, SP
.text:0008C52C STMFD SP!, {R4-R7,R11,R12,LR,PC}
.text:0008C530 LDR R4, =(_GLOBAL_OFFSET_TABLE_ - 0x8C548)
.text:0008C534 SUBS R5, R0, #0
.text:0008C538 SUB R11, R12, #4
.text:0008C53C MOV R6, R1
.text:0008C540 ADD R4, PC, R4 ; _GLOBAL_OFFSET_TABLE_
.text:0008C544 LDMEQFD SP, {R4-R7,R11,SP,PC}
.text:0008C548 LDR R1, =(aShmold - 0xC719C)
.text:0008C54C MOV R2, #7 ; n
.text:0008C550 ADD R1, R4, R1 ; "shmold:"
.text:0008C554 BL strncmp
.text:0008C558 CMP R0, #0
.text:0008C55C BEQ loc_8C5F0
.text:0008C560 LDR R1, =(aShmmpx - 0xC719C)
.text:0008C564 MOV R0, R5 ; s1
.text:0008C568 MOV R2, #7 ; n
.text:0008C56C ADD R1, R4, R1 ; "shmmpx:"
.text:0008C570 BL strncmp
.text:0008C574 CMP R0, #0
.text:0008C578 BEQ loc_8C600
.text:0008C57C LDR R1, =(aShmext - 0xC719C)
.text:0008C580 MOV R0, R5 ; s1
.text:0008C584 MOV R2, #7 ; n
.text:0008C588 ADD R1, R4, R1 ; "shmext:"
.text:0008C58C BL strncmp
.text:0008C590 CMP R0, #0
.text:0008C594 BEQ loc_8C5E0
.text:0008C598 LDR R1, =(aShm - 0xC719C)
.text:0008C59C MOV R0, R5 ; s1
.text:0008C5A0 MOV R2, #4 ; n
.text:0008C5A4 ADD R1, R4, R1 ; "shm:"
.text:0008C5A8 BL strncmp
.text:0008C5AC CMP R0, #0
.text:0008C5B0 BEQ loc_8C620
.text:0008C5B4 LDR R1, =(aQnx - 0xC719C)
.text:0008C5B8 MOV R0, R5 ; s1
.text:0008C5BC MOV R2, #4 ; n
.text:0008C5C0 ADD R1, R4, R1 ; "qnx:"
.text:0008C5C4 BL strncmp
.text:0008C5C8 CMP R0, #0
.text:0008C5CC BEQ loc_8C610
.text:0008C5D0 MOV R0, R5 ; this
.text:0008C5D4 UXTH R1, R6
.text:0008C5D8 LDMFD SP, {R4-R7,R11,SP,LR}
.text:0008C5DC B j__ZN3tsd6common3ipc5posix24createSocketListenServerEPKct ; tsd::common::ipc::posix::createSocketListenServer(char const*,ushort)
.text:0008C5E0 ; ---------------------------------------------------------------------------
.text:0008C5E0
.text:0008C5E0 loc_8C5E0 ; CODE XREF: tsd::common::ipc::createListenServer(char const*,uint)+6Cj
.text:0008C5E0 ADD R0, R5, #7 ; this
.text:0008C5E4 MOV R1, R6 ; char *
.text:0008C5E8 LDMFD SP, {R4-R7,R11,SP,LR}
.text:0008C5EC B j__ZN3tsd6common3ipc5posix33createExtSharedMemoryListenServerEPKcj ; tsd::common::ipc::posix::createExtSharedMemoryListenServer(char const*,uint)
.text:0008C5F0 ; ---------------------------------------------------------------------------
.text:0008C5F0
.text:0008C5F0 loc_8C5F0 ; CODE XREF: tsd::common::ipc::createListenServer(char const*,uint)+34j
.text:0008C5F0 ADD R0, R5, #7 ; this
.text:0008C5F4 MOV R1, R6 ; char *
.text:0008C5F8 LDMFD SP, {R4-R7,R11,SP,LR}
.text:0008C5FC B j__ZN3tsd6common3ipc5posix30createSharedMemoryListenServerEPKcj ; tsd::common::ipc::posix::createSharedMemoryListenServer(char const*,uint)
.text:0008C600 ; ---------------------------------------------------------------------------
.text:0008C600
.text:0008C600 loc_8C600 ; CODE XREF: tsd::common::ipc::createListenServer(char const*,uint)+50j
.text:0008C600 ADD R0, R5, #7 ; this
.text:0008C604 MOV R1, R6 ; char *
.text:0008C608 LDMFD SP, {R4-R7,R11,SP,LR}
.text:0008C60C B j__ZN3tsd6common3ipc5posix39createMultiplexSharedMemoryListenServerEPKcj ; tsd::common::ipc::posix::createMultiplexSharedMemoryListenServer(char const*,uint)
.text:0008C610 ; ---------------------------------------------------------------------------
.text:0008C610
.text:0008C610 loc_8C610 ; CODE XREF: tsd::common::ipc::createListenServer(char const*,uint)+A4j
.text:0008C610 ADD R0, R5, #4 ; this
.text:0008C614 MOV R1, R6 ; char *
.text:0008C618 LDMFD SP, {R4-R7,R11,SP,LR}
.text:0008C61C B j__ZN3tsd6common3ipc3qnx21createQnxListenServerEPKcj ; tsd::common::ipc::qnx::createQnxListenServer(char const*,uint)
.text:0008C620 ; ---------------------------------------------------------------------------
.text:0008C620
.text:0008C620 loc_8C620 ; CODE XREF: tsd::common::ipc::createListenServer(char const*,uint)+88j
.text:0008C620 ADD R0, R5, #4 ; this
.text:0008C624 MOV R1, R6 ; char *
.text:0008C628 LDMFD SP, {R4-R7,R11,SP,LR}
.text:0008C62C B j__ZN3tsd6common3ipc5posix33createExtSharedMemoryListenServerEPKcj ; tsd::common::ipc::posix::createExtSharedMemoryListenServer(char const*,uint)
.text:0008C62C ; End of function tsd::common::ipc::createListenServer(char const*,uint)
下面是调用createListenServer的代码
可以看出只给r0和r1传了参数,分别对应createListenServer函数的参数2和参数3,this不知道用什么传的??
.text:001117E0 LDR R0, =(a0_0_0_0 - 0x1FA9E0)
.text:001117E4 MOV R1, #5555 ; char *
.text:001117E8 ADD R0, R6, R0 ; "0.0.0.0"
.text:001117EC BL _ZN3tsd6common3ipc18createListenServerEPKcj ; tsd::common::ipc::createListenServer(char const*,uint)
.text:001117F0 LDR R0, =(aShmHmi - 0x1FA9E0)
.text:001117F4 MOV R1, #4096 ; char *
.text:001117F8 ADD R0, R6, R0 ; "shm:HMI"
.text:001117FC BL _ZN3tsd6common3ipc18createListenServerEPKcj ; tsd::common::ipc::createListenServer(char const*,uint)
.text:00111800 LDR R0, =(aShmPicserver - 0x1FA9E0)
.text:00111804 MOV R1, #0x1000 ; char *
.text:00111808 ADD R0, R6, R0 ; "shm:PICSERVER"
.text:0011180C BL _ZN3tsd6common3ipc18createListenServerEPKcj ; tsd::common::ipc::createListenServer(char const*,uint)
.text:00111810 BL sub_11137C
.text:00111814 LDR R0, =(aQnxRoot - 0x1FA9E0)
.text:00111818 MOV R1, #0 ; char *
.text:0011181C ADD R0, R6, R0 ; "qnx:root"
.text:00111820 BL _ZN3tsd6common3ipc18createListenServerEPKcj ; tsd::common::ipc::createListenServer(char const*,uint)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课