CN107291480B - 一种函数调用方法及装置 - Google Patents
一种函数调用方法及装置 Download PDFInfo
- Publication number
- CN107291480B CN107291480B CN201710698756.1A CN201710698756A CN107291480B CN 107291480 B CN107291480 B CN 107291480B CN 201710698756 A CN201710698756 A CN 201710698756A CN 107291480 B CN107291480 B CN 107291480B
- Authority
- CN
- China
- Prior art keywords
- function
- memory
- virtual stack
- called
- calling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种函数调用方法及装置,所述方法包括:将待调用函数的源文件编译成二进制文件,二进制文件中包括数据段、代码段和文件头,文件头用于存储数据段和代码段的位置信息;将数据段、代码段和文件头加载入内存中,并记录内存地址;利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存;将所述待调用函数的参数,以二进制码流的形式写入所述虚拟栈,以便在所述待调用函数运行时从所述虚拟栈中调用所述参数;通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用。本发明提供了一种通用的函数调用方法,能够自动化的完成函数的调用,提高了函数调用效率,且不需要操作人员具有计算机编程知识。
Description
技术领域
本发明涉及数据处理领域,具体涉及一种函数调用方法及装置。
背景技术
在高级语言程序设计中,为了实现函数调用,需要对函数的接口信息进行分析,具体包括参数类型、参数入栈方向、参数传递模式等,完成对接口信息的分析后,针对该函数设计相应的调用模块。
由于不同的函数的接口信息一般不同,所以,现有技术的函数调用方法需要针对每个函数均进行接口信息的分析,并分别设计针对性的调用模块。由于不同的函数的接口信息不同,所以现有技术中需要分别针对每个函数的接口信息进行分析,另外,不同函数的参数传递模式也不同,反映出入栈的形式也不同,可能为了提高效率部分入栈还会采用寄存器,所以现有技术中还需要对不同函数的上述内容进行分析,分析过程复杂、困难,从而导致对函数的调用效率较低。
发明内容
本发明提供了一种函数调用方法及装置,能够自动化的完成函数的调用,提高了函数调用效率。
本发明实施例提供了一种函数调用方法,所述方法包括:
将待调用函数的源文件编译成二进制文件,所述二进制文件中包括数据段、代码段和文件头,所述文件头用于存储所述数据段和所述代码段的位置信息;
将所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址;
利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存;
将所述待调用函数的参数,以二进制码流的形式写入所述虚拟栈,以便在所述待调用函数运行时从所述虚拟栈中调用所述参数;
通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用。
可选的,所述待调用函数为多个时,所述方法还包括:
将各个待调用函数的二进制文件中的数据段进行拼装,得到拼装后数据段;
将各个待调用函数的二进制文件中的代码段进行拼装,得到拼装后代码段;
获取拼装后文件,所述拼装后文件中包括所述拼装后数据段、所述拼装后代码段和文件头,所述文件头存储有所述拼装后数据段和所述拼装后代码段的位置信息;
相应的,所述将所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址,包括:
将所述拼装后数据段、所述拼装后代码段和所述文件头加载入内存,并记录内存地址。
可选的,所述为所述虚拟栈分配内存,包括:
利用系统内存分配函数,为所述虚拟栈动态分配内存;
或,
通过静态链接库或动态连接库占据内存,为所述虚拟栈静态分配内存。
可选的,所述方法应用于函数测试程序中。
可选的,所述通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用之前,还包括:
内嵌汇编指令或注入二进制指令码,所述汇编指令和所述二进制指令码均用于指示先将所述程序指针寄存器的值保存在所述虚拟栈的首地址中,再将所述程序指针寄存器的值修改为所述虚拟栈的首地址+4。
可选的,所述通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用之后,还包括:
当所述待调用函数测试结束后,返回地址寄存器,保存下一条指令的内存地址,从所述虚拟栈的首地址中读取所述程序指针寄存器的值,并顺序从所述程序指针寄存器中恢复现场。
本发明实施例还提供了一种函数调用装置,所述装置包括:
编译模块,用于将待调用函数的源文件编译成二进制文件,所述二进制文件中包括数据段、代码段和文件头,所述文件头用于存储所述数据段和所述代码段的位置信息;
加载模块,用于将所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址;
建立模块,用于利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存;
写入模块,用于将所述待调用函数的参数,以二进制码流的形式写入所述虚拟栈,以便在所述待调用函数运行时从所述虚拟栈中调用所述参数;
调用模块,用于通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用。
可选的,所述待调用函数为多个时,所述装置还包括:
第一拼装模块,用于将各个待调用函数的二进制文件中的数据段进行拼装,得到拼装后数据段;
第二拼装模块,用于将各个待调用函数的二进制文件中的代码段进行拼装,得到拼装后代码段;
获取模块,用于获取拼装后文件,所述拼装后文件中包括所述拼装后数据段、所述拼装后代码段和文件头,所述文件头存储有所述拼装后数据段和所述拼装后代码段的位置信息;
相应的,所述加载模块,具体用于将所述拼装后数据段、所述拼装后代码段和所述文件头加载入内存,并记录内存地址。
可选的,所述建立模块,包括:
第一分配子模块,用于利用系统内存分配函数,为所述虚拟栈动态分配内存;
或,
第二分配子模块,用于通过静态链接库或动态连接库占据内存,为所述虚拟栈静态分配内存。
可选的,所述装置应用于函数测试程序中。
可选的,所述装置还包括:
内嵌或注入模块,用于内嵌汇编指令或注入二进制指令码,所述汇编指令和所述二进制指令码均用于指示先将所述程序指针寄存器的值保存在所述虚拟栈的首地址中,再将所述程序指针寄存器的值修改为所述虚拟栈的首地址+4。
可选的,所述装置还包括:
处理模块,用于当所述待调用函数测试结束后,返回地址寄存器,保存下一条指令的内存地址,从所述虚拟栈的首地址中读取所述程序指针寄存器的值,并顺序从所述程序指针寄存器中恢复现场。
由于本发明实施例将函数的源文件编译成二进制文件,即将高级程序语言编写的代码编译成二进制机器码进行传递,不需要关心函数的应用层含义,对于底层而言均是字节流。所以,本发明实施例提供的是一种通用的函数调用方法,能够自动化的完成函数的调用,提高了函数调用效率,且不需要操作人员具有计算机编程知识。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种函数调用方法流程图;
图2为本发明实施例提供的一种函数调用装置的结构示意图;
图3为本发明实施例提供的另一种函数调用装置的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
由于现有技术中的函数调用方法是基于软件应用层的,不同的函数的接口信息不同,所以需要对各个函数的接口信息分别进行分析,才能完成各个函数的调用。
另外,不同函数的参数传递模式也不同,反映出入栈的形式也不同,可能为了提高效率部分入栈还会采用寄存器,所以现有技术中还需要对不同函数的上述内容进行分析,分析过程复杂、困难,从而导致对函数的调用效率较低。
而本发明是基于软件系统底层进行函数调用,不关心软件应用层的接口信息。由于对于底层而言,不同的函数具备同样的结构,即使是采用不同的高级语言编写的函数,底层对其的处理也是一样的。所以,本发明提供了一种通用的函数调用方法,针对不同的函数,能够利用通用函数接口自动化的完成函数调用,不需要操作人员针对不同的函数进行分析,提高了函数调用的效率。
具体的,参考图1,为本发明实施例提供的一种函数调用方法流程图,所述方法具体可以包括:
S101:将待调用函数的源文件编译成二进制文件,所述二进制文件中包括数据段、代码段和文件头,所述文件头用于存储所述数据段和所述代码段的位置信息。
本发明实施例中,待调用函数可以是采用各种高级程序语言编写的函数,如采用C语言编写的函数。
实际应用中,系统在接收到待调用函数后,经由编译器、汇编器等对该待调用函数的源文件进行编译,得到二进制文件。该二进制文件中包括该待调用函数的代码段、数据段和文件头,其中,文件头用于存储数据段和代码段的位置信息,包括数据段和代码段的地址、长度等。
一种应用场景中,本发明实施例提供的函数调用方法可以应用于函数测试程序中。具体的,函数测试程序用于对函数进行测试,以通过测试结果确定函数是否能够正常运行。
在函数测试程序的应用场景中,对函数进行测试时需要调用待测试函数,具体的,利用本发明实施例提供的函数调用方法能够自动化的实现对函数的调用。
另外,函数测试程序的测试函数可以是一个或多个,针对多个函数同时测试的情况,本发明实施例可以实现对多个函数的同时调用。
具体的,获取各个待调用函数的二进制文件后,提取各个二进制文件中的代码段、数据段,并分别对各个二进制文件的代码段和数据段进行拼装。例如,代码段1,代码段2……代码段n代表n个二进制文件中的代码段,本发明实施例将代码段1,代码段2……代码段n拼装,得到拼装后的代码段;具体的,根据系统指令集类型进行代码段的拼装,如RISC指令集系统,指令结构是按4或8字节对齐,因此,代码段可以通过直接拷贝的方式进行拼接,而如CISC体系结构下,指令结构是变长的,因此,需要根据指令集特征进行拼接。
同样的,将数据段1,数据段2……数据段n拼装,得到拼装后的数据段。由于数据段一般需要对齐,所以在拷贝数据段进行拼装的过程中需要通过补零的方式进行补齐操作,以保证后续对数据进行寻址的有效性。
另外,将拼装后的数据段和拼装后的代码段组成拼装后的文件,并生成该拼装后的文件的文件头,其中,该文件头用于存储拼装后的数据段和拼装后的代码段的位置信息。具体的,位置信息可以包括各个代码段、数据段的偏移量,以便后续对函数调用时能够根据初始地址和偏移量进一步确定对应的代码段和数据段的地址。
由于拼装后的文件中的代码段、数据段之间的相对地址发生了变化,因此,本发明实施例还需在该拼装后的文件的文件头中存储各个代码段和数据段之间的相对地址的变化信息,即各个代码段和数据段的偏移量,根据代码段i和与其匹配的数据段i之间的偏移量,对文件头进行填充。具体步骤如下所述:
步骤一:以代码段i、数据段i,文件头i为例,假设代码段i、数据段i之间的偏移量集合为{offseti1,offseti2,...,offsetij};
步骤二:假设在新的二进制文件中,代码段i的后续代码段是由{代码段i+1,代码段i+2,...,代码段n}构成,数据段i的后续数据段是由{数据段i+1,数据段i+2,...,数据段n}构成,而代码段i、数据段i之间原始偏移量为offseti,那么其偏移量集合为{offseti1,offseti2,...,offsetij}的基值累加,size(代码段i+1,代码段i+2,...,代码段n)+size(数据段i+1,数据段i+2,...,数据段n),其中size代表段的长度。
步骤三:根据所述进行基值累加后的offseti,对代码段i内对数据段i进行数据访问的二进制机器码进行修改。
S102:将所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址。
本发明实施例在获取二进制文件后,提取其中的数据段、代码段和文件头,并将数据段、代码段和文件头加载入内存,并记录内存地址。
对于拼装后的二进制文件,提取拼装后的数据段、拼装后的代码段和拼装后的文件头,并将拼装后的数据段、拼装后的代码段和拼装后的文件头加载入内存,并记录内存地址。
在上述函数测试程序的应用场景中,在函数测试程序执行过程中,可以通过动态修改函数测试程序跳转地址实现对相应位置的数据访问。实际应用中,将函数测试程序中预设跳转指针指向记录的内存地址,实现对该内存地址对应的数据的访问。
S103:利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存。
S104:将所述待调用函数的参数,以二进制码流的形式写入所述虚拟栈,以便在所述待调用函数运行时从所述虚拟栈中调用所述参数。
本发明实施例中,预先利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存,虚拟栈用于待调用函数的参数传递。
由于各个待调用函数的程序本身具有自身维护的栈框架,在函数调用过程中,函数调用程序与待调用函数需要运用同一套栈地址空间。一旦待调用函数出现栈溢出等问题,将影响函数调用主程序的执行,为了避免栈溢出等问题的发生,本发明实施例为待调用函数建立虚拟栈,具体的,可以通过添加额外的数据段,并将待调用函数的栈指针指向该数据段所在区域,从而实现虚拟栈。由于虚拟栈的内存空间不受限制,所以本发明实施例能够避免栈溢出等问题。
具体的,为虚拟栈分配内存的方式如下:
动态分配:利用系统内存分配函数,如malloc等函数,从堆空间内动态获取足够长的内存空间,并将该内存空间的首地址作为虚拟栈的起始地址,完成为虚拟栈的内存分配;
静态分配:加载占据一定内存空间的静态链接库或动态链接库至内存,其中的代码段、数据段均可用于虚拟栈,完成为虚拟栈的内存分配。
实际应用中,在完成对虚拟栈的内存分配后,将该虚拟栈的地址写入操作系统的程序指针寄存器中,以便在执行函数调用的过程中,系统通过程序指针寄存器中存储的虚拟栈的地址,对该虚拟栈中的参数进行访问。具体的,可以采用bytecode技术覆盖代码段的方式,实现将虚拟栈的地址写入操作系统的程序指针寄存器的操作。
其中,采用bytecode技术覆盖代码段的方式的一种具体实现步骤可以如下:
步骤一、内嵌汇编指令或注入二进制指令码,以将a11的值保存在虚拟栈首地址,并将a11的值修改为虚拟栈空间首地址+4,这是为了解决栈地址的保存,其中,a11是一种程序指针寄存器。
步骤二、待调用函数完成调用后,从虚拟栈首地址读取原始a11的值;
步骤三、返回地址寄存器a12,保存函数调用下一条指令的内存地址;
步骤四、将参数信息,以步骤一所述的方式,直接拷贝至虚拟栈的内存中;
步骤五、调用结束后,顺序从a11中恢复现场。
另外,避免对其他程序造成影响,本发明实施例在将该虚拟栈的地址写入程序指针寄存器之前,预先将程序指针寄存器的当前值保留,待函数调用结束后,对其进行恢复。
实际应用中,待调用函数的参数类型可能包括形参和实参,形参传值,实参传地址,但是对于本发明实施例中的虚拟栈而言,形参和实参同是数据,没有参数类型的区别。本发明实施例提供了如下将待调用函数的参数写入虚拟栈的方法,以RISC体系结构为例,一般采用4字节对齐,如果采用字节流时,需要按参数进行对齐,具体实现如下:
假设待调用函数存在参数列表{param1,param2,...,.paramn},其参数类型分别为{type1,type2,...,typen}。
本发明实施例中,预先接收用户设置的二进制码流的长度,即单次写入虚拟栈的参数长度。由于采用4字节对齐,需要在非对齐的部分补齐,即补充“/0”,具体的补齐方式如下:
((Sizeof(type1)/4)*4+((Sizeof(type1)%4)==0?4:0))+
((Sizeof(type2)/4)*4+((Sizeof(type2)%4)==0?4:0))+
.... +
((Sizeof(typen)/4)*4+((Sizeof(typen)%4)==0?4:0));
S105:通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用。
在传统栈结构中,对参数压栈是按照指定的参数入栈顺序,依次将参数压入堆栈内。从汇编层次来看,与栈相关的汇编指令,根据程序对参数的使用情况,按照生命周期进行离散分布,并择时出栈。而本发明实施例中,为了屏蔽用户对函数接口定义的理解,为此,对虚拟栈的压栈和出栈是一次性完成的。以下提供了一种对虚拟栈的压栈和出栈的实现方式:
首先,根据用户设置的二进制码流的长度,对a11多次累加len,其中len是4字节对齐的。其次,分析待调用函数中的数据依赖关系,将待调用函数中与出栈相关的指令利用Bytecode技术填充为Nop指令。
实际应用中,虚拟栈的生成是通过内嵌汇编代码的方式实现的,具体如下;
步骤一:编写原始架构代码,通过编译器编译形成汇编语言,以下是sccall函数对Test函数的调用:
步骤二:编译原始架构代码,生成汇编程序,并记录Test函数相对sccall函数的相对偏移量。
步骤三:添加下述汇编指令01,02,04,其中01用于保存栈指针寄存器a11,02用于设定栈指针,04用于在调用结束后恢复,具体如下:
01pr0 stw“虚拟堆栈地址”,a11,.
02pr0 move a11,虚拟堆栈地址+4(0-(len)).
03sccall(param);
04pr0 ldw a11“虚拟堆栈地址”.
本发明实施例中,在虚拟栈建立完成后,如上述步骤一中完成对Test函数的调用,通过预先设置的通用函数接口,依据待调用函数的数据段、代码段和文件头的内存地址完成对该函数的调用。
由于本发明实施例将函数的源文件编译成二进制文件,即将高级程序语言编写的代码编译成二进制机器码进行传递,不需要关心函数的应用层含义,对于底层而言均是字节流。所以,本发明实施例提供的是一种通用的函数调用方法,能够自动化的完成函数的调用,提高了函数调用效率,且不需要操作人员具有计算机编程知识。
本发明实施例不仅提供了一种通用的函数调用方法,还相应的提供了一种通用的函数栈,即虚拟栈,用于解决通用参数传递的问题。在利用通用的函数调用方法和通用的函数栈时,不需要关心函数应用层的信息,从底层的角度完成对函数的调用,以及对函数的测试。
另一种应用场景中,本发明实施例提供的函数调用方法还可以应用于软件功能模块之间的调用。
具体的,当一个应用软件需要调用另一个应用软件中的功能函数时,利用本发明提供的函数调用方法,不需要关心待调用函数的接口信息,甚至不需要关心待调用函数的编程语言等等,也就是说,由不同的编程语言编写的功能函数之间能够互相调用。
具体的,首先将该功能函数的源文件编译成二进制文件,其中二进制文件中包括数据段、代码段和文件头;其次,将数据段、代码段和文件头加载入内存中,并记录内存地址;最后,调用方应用软件的地址跳转到该内存地址,通过通用函数接口,依据该内存地址调用被调用方的功能函数。
与上述方法实施方式相对应的,本发明实施例还提供了一种函数调用装置,参考图2,为本发明实施例提供的一种函数调用装置结构示意图,所述装置包括:
编译模块201用于将待调用函数的源文件编译成二进制文件,所述二进制文件中包括数据段、代码段和文件头,所述文件头用于存储所述数据段和所述代码段的位置信息;
加载模块202,用于将所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址;
建立模块203,用于利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存;
写入模块204,用于将所述待调用函数的参数,以二进制码流的形式写入所述虚拟栈,以便在所述待调用函数运行时从所述虚拟栈中调用所述参数;
调用模块205,用于通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用。
一种实现方式中,所述待调用函数为多个时,所述装置还可以包括:
第一拼装模块,用于将各个待调用函数的二进制文件中的数据段进行拼装,得到拼装后数据段;
第二拼装模块,用于将各个待调用函数的二进制文件中的代码段进行拼装,得到拼装后代码段;
获取模块,用于获取拼装后文件,所述拼装后文件中包括所述拼装后数据段、所述拼装后代码段和文件头,所述文件头存储有所述拼装后数据段和所述拼装后代码段的位置信息;
相应的,所述加载模块,具体用于将所述拼装后数据段、所述拼装后代码段和所述文件头加载入内存,并记录内存地址。
具体的,所述建立模块可以包括:
第一分配子模块,用于利用系统内存分配函数,为所述虚拟栈动态分配内存;
或,
第二分配子模块,用于通过静态链接库或动态连接库占据内存,为所述虚拟栈静态分配内存。
具体的,所述装置可以应用于函数测试程序中。
一种实现方式中,所述装置还包括:
内嵌或注入模块,用于内嵌汇编指令或注入二进制指令码,所述汇编指令和所述二进制指令码均用于指示先将所述程序指针寄存器的值保存在所述虚拟栈的首地址中,再将所述程序指针寄存器的值修改为所述虚拟栈的首地址+4。
另外,所述装置还可以包括:
处理模块,用于当所述待调用函数测试结束后,返回地址寄存器,保存下一条指令的内存地址,从所述虚拟栈的首地址中读取所述程序指针寄存器的值,并顺序从所述程序指针寄存器中恢复现场。
由于本发明实施例将函数的源文件编译成二进制文件,即将高级程序语言编写的代码编译成二进制机器码进行传递,不需要关心函数的应用层含义,对于底层而言均是字节流。所以,本发明实施例提供的是一种通用的函数调用装置,能够自动化的完成函数的调用,提高了函数调用效率,且不需要操作人员具有计算机编程知识。
本发明实施例不仅提供了一种通用的函数调用方法,还相应的提供了一种通用的函数栈,即虚拟栈。在利用通用的函数调用方法和通用的函数栈时,不需要关心函数应用层的信息,从底层的角度完成对函数的调用,以及对函数的测试。
本发明还提供了一种函数调用装置的结构示意图,如图3所示,其中,所述设备至少包括一个存储器301和至少一个处理器302,还包括至少一个网络接口303;存储器301、处理器302和网络接口303之间通过总线相互连接。
存储器301用于存储程序代码,并将该程序代码传输给该处理器302。
处理器302用于根据所述程序代码中的指令,执行以下步骤:将待调用函数的源文件编译成二进制文件,所述二进制文件中包括数据段、代码段和文件头,所述文件头用于存储所述数据段和所述代码段的位置信息;
将所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址;
利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存;
将所述待调用函数的参数,以二进制码流的形式写入所述虚拟栈,以便在所述待调用函数运行时从所述虚拟栈中调用所述参数;
通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用。
进一步的,所述待调用函数为多个时,所述方法还包括:
将各个待调用函数的二进制文件中的数据段进行拼装,得到拼装后数据段;
将各个待调用函数的二进制文件中的代码段进行拼装,得到拼装后代码段;
获取拼装后文件,所述拼装后文件中包括所述拼装后数据段、所述拼装后代码段和文件头,所述文件头存储有所述拼装后数据段和所述拼装后代码段的位置信息;
相应的,所述将所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址,包括:
将所述拼装后数据段、所述拼装后代码段和所述文件头加载入内存,并记录内存地址。
进一步的,所述为所述虚拟栈分配内存,包括:
利用系统内存分配函数,为所述虚拟栈动态分配内存;
或,
通过静态链接库或动态连接库占据内存,为所述虚拟栈静态分配内存。
进一步的,所述方法应用于函数测试程序中。
进一步的,所述通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用之前,还包括:
内嵌汇编指令或注入二进制指令码,所述汇编指令和所述二进制指令码均用于指示先将所述程序指针寄存器的值保存在所述虚拟栈的首地址中,再将所述程序指针寄存器的值修改为所述虚拟栈的首地址+4。
进一步的,所述通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用之后,还包括:
当所述待调用函数测试结束后,返回地址寄存器,保存下一条指令的内存地址,从所述虚拟栈的首地址中读取所述程序指针寄存器的值,并顺序从所述程序指针寄存器中恢复现场。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明实施例所提供的一种函数调用方法及装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种函数调用方法,其特征在于,所述方法包括:
将待调用函数的源文件编译成二进制文件,所述二进制文件中包括数据段、代码段和文件头,所述文件头用于存储所述数据段和所述代码段的位置信息;
将已获取的二进制文件中提取的所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址;
利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存;
将所述待调用函数的参数,以二进制码流的形式写入所述虚拟栈,以便在所述待调用函数运行时从所述虚拟栈中调用所述参数;
通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用;
所述函数调用方法,其特征在于,所述待调用函数为多个时,所述方法还包括:
将各个待调用函数的二进制文件中的数据段进行拼装,得到拼装后数据段;
将各个待调用函数的二进制文件中的代码段进行拼装,得到拼装后代码段;
获取拼装后文件,所述拼装后文件中包括所述拼装后数据段、所述拼装后代码段和文件头,所述文件头存储有所述拼装后数据段和所述拼装后代码段的位置信息;
相应的,所述将所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址,包括:
将所述拼装后数据段、所述拼装后代码段和所述文件头加载入内存,并记录内存地址。
2.根据权利要求1所述的函数调用方法,其特征在于,所述为所述虚拟栈分配内存,包括:
利用系统内存分配函数,为所述虚拟栈动态分配内存;
或,
通过静态链接库或动态连接库占据内存,为所述虚拟栈静态分配内存。
3.根据权利要求1-2中任一项所述的函数调用方法,其特征在于,所述方法应用于函数测试程序中。
4.根据权利要求3所述的函数调用方法,其特征在于,所述通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用之前,还包括:
内嵌汇编指令或注入二进制指令码,所述汇编指令和所述二进制指令码均用于指示先将所述程序指针寄存器的值保存在所述虚拟栈的首地址中,再将所述程序指针寄存器的值修改为所述虚拟栈的首地址+4。
5.根据对权利要求3所述的函数调用方法,其特征在于,所述通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用之后,还包括:
当所述待调用函数测试结束后,返回地址寄存器,保存下一条指令的内存地址,从所述虚拟栈的首地址中读取所述程序指针寄存器的值,并顺序从所述程序指针寄存器中恢复现场。
6.一种函数调用装置,其特征在于,所述装置包括:
编译模块,用于将待调用函数的源文件编译成二进制文件,所述二进制文件中包括数据段、代码段和文件头,所述文件头用于存储所述数据段和所述代码段的位置信息;
加载模块,用于将已获取的二进制文件中提取的所述数据段、所述代码段和所述文件头加载入内存中,并记录内存地址;
建立模块,用于利用程序指针寄存器建立虚拟栈,并为所述虚拟栈分配内存;
写入模块,用于将所述待调用函数的参数,以二进制码流的形式写入所述虚拟栈,以便在所述待调用函数运行时从所述虚拟栈中调用所述参数;
调用模块,用于通过调用预设通用函数接口,利用所述虚拟栈,并依据所述内存地址,对所述待调用函数进行调用;
所述函数调用装置,其特征在于,所述待调用函数为多个时,所述装置还包括:
第一拼装模块,用于将各个待调用函数的二进制文件中的数据段进行拼装,得到拼装后数据段;
第二拼装模块,用于将各个待调用函数的二进制文件中的代码段进行拼装,得到拼装后代码段;
获取模块,用于获取拼装后文件,所述拼装后文件中包括所述拼装后数据段、所述拼装后代码段和文件头,所述文件头存储有所述拼装后数据段和所述拼装后代码段的位置信息;
相应的,所述加载模块,具体用于将所述拼装后数据段、所述拼装后代码段和所述文件头加载入内存,并记录内存地址。
7.根据权利要求6所述的函数调用装置,其特征在于,所述建立模块,包括:
第一分配子模块,用于利用系统内存分配函数,为所述虚拟栈动态分配内存;
或,
第二分配子模块,用于通过静态链接库或动态连接库占据内存,为所述虚拟栈静态分配内存。
8.根据权利要求6-7中任一项所述的函数调用装置,其特征在于,所述装置应用于函数测试程序中。
9.根据权利要求8所述的函数调用装置,其特征在于,所述装置还包括:
内嵌或注入模块,用于内嵌汇编指令或注入二进制指令码,所述汇编指令和所述二进制指令码均用于指示先将所述程序指针寄存器的值保存在所述虚拟栈的首地址中,再将所述程序指针寄存器的值修改为所述虚拟栈的首地址+4。
10.根据权利要求8所述的函数调用装置,其特征在于,所述装置还包括:
处理模块,用于当所述待调用函数测试结束后,返回地址寄存器,保存下一条指令的内存地址,从所述虚拟栈的首地址中读取所述程序指针寄存器的值,并顺序从所述程序指针寄存器中恢复现场。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710698756.1A CN107291480B (zh) | 2017-08-15 | 2017-08-15 | 一种函数调用方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710698756.1A CN107291480B (zh) | 2017-08-15 | 2017-08-15 | 一种函数调用方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107291480A CN107291480A (zh) | 2017-10-24 |
CN107291480B true CN107291480B (zh) | 2020-12-15 |
Family
ID=60106884
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710698756.1A Active CN107291480B (zh) | 2017-08-15 | 2017-08-15 | 一种函数调用方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107291480B (zh) |
Families Citing this family (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108196900B (zh) * | 2017-12-08 | 2021-11-09 | 五八有限公司 | 组件的注册方法及装置 |
CN108897533A (zh) * | 2018-06-06 | 2018-11-27 | 北京奇虎科技有限公司 | 一种函数调用的方法、装置及终端 |
CN110569644B (zh) * | 2018-06-06 | 2023-05-09 | 阿里巴巴集团控股有限公司 | 调用请求的处理、功能函数的调用方法、装置及设备 |
CN109032605B (zh) * | 2018-07-05 | 2022-09-20 | 北京奇艺世纪科技有限公司 | 一种应用运行方法和装置 |
CN109086147B (zh) * | 2018-07-31 | 2022-02-22 | 深圳市元征科技股份有限公司 | 应用程序的服务接口调用方法、装置及存储介质 |
CN109710426A (zh) * | 2018-12-24 | 2019-05-03 | 珠海豹趣科技有限公司 | 一种进程间通信方法及相关设备 |
CN111736913B (zh) * | 2019-03-25 | 2021-11-19 | 华为技术有限公司 | 类加载方法和装置 |
CN110147238B (zh) * | 2019-05-29 | 2022-11-11 | 中国人民解放军战略支援部队信息工程大学 | 一种程序编译方法、装置及系统 |
CN110618940B (zh) * | 2019-09-19 | 2024-02-06 | 腾讯科技(深圳)有限公司 | 堆栈信息追踪方法、装置、计算机可读介质及计算装置 |
CN112541188B (zh) * | 2019-09-20 | 2022-05-13 | 武汉斗鱼网络科技有限公司 | 阻止应用程序代码被静态分析的方法及装置 |
CN110780818B (zh) * | 2019-10-24 | 2023-05-30 | 山东浪潮科学研究院有限公司 | 一种基于量子测控系统软件读取任意数据的文件实现方法 |
CN111142969A (zh) * | 2019-12-27 | 2020-05-12 | 贵阳动视云科技有限公司 | 64位程序调用32位程序模块的方法、装置、介质及设备 |
CN111752829B (zh) * | 2020-06-22 | 2022-10-14 | 中国人民解放军海军工程大学 | 嵌入式系统固件程序的动态调试方法 |
CN112882695B (zh) * | 2021-03-02 | 2023-11-28 | 百果园技术(新加坡)有限公司 | 传参方法、装置、计算机设备及存储介质 |
CN114895921B (zh) * | 2022-06-08 | 2023-05-26 | 北京深盾科技股份有限公司 | 文件处理方法、装置、电子设备及存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1811717A (zh) * | 2006-01-10 | 2006-08-02 | 杭州东信灵通电子实业公司 | 通用进程间通信实现方法 |
CN101051276A (zh) * | 2007-05-15 | 2007-10-10 | 东南大学 | 嵌入式微处理器的存储子系统内存自动布局方法 |
CN101187881A (zh) * | 2007-12-03 | 2008-05-28 | 浙江大学 | 一种用于处理器仿真模型中的系统调用转换直通通道方法 |
CN106649105A (zh) * | 2016-12-08 | 2017-05-10 | 武汉斗鱼网络科技有限公司 | 一种内存泄漏的检测方法和装置 |
US9690709B2 (en) * | 2014-07-14 | 2017-06-27 | Oracle International Corporation | Variable handles |
CN106991328A (zh) * | 2017-03-30 | 2017-07-28 | 兴华永恒(北京)科技有限责任公司 | 一种基于动态内存指纹异常分析的漏洞利用检测识别方法 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101393529B (zh) * | 2008-11-07 | 2011-01-12 | 用友软件股份有限公司 | 一种实现计算机软件多语言支持的方法 |
US9128802B2 (en) * | 2010-09-30 | 2015-09-08 | Genesys Telecommunications Laboratories, Inc. | Automated call center software build generator |
US20130060989A1 (en) * | 2011-09-07 | 2013-03-07 | Fusion-Io, Inc. | Apparatus, system, and method for referencing data block usage information by way of an interface |
US9830172B2 (en) * | 2012-06-30 | 2017-11-28 | Microsoft Technology Licensing, Llc | Implementing functional kernels using compiled code modules |
CN104516740B (zh) * | 2013-09-26 | 2019-07-16 | 腾讯科技(深圳)有限公司 | 一种函数调用方法、装置及移动终端 |
CN103761089B (zh) * | 2014-01-14 | 2017-09-15 | 清华大学 | 基于寄存器传输语言确定动态函数调用关系的方法 |
GB2528270A (en) * | 2014-07-15 | 2016-01-20 | Advanced Risc Mach Ltd | Call stack maintenance for a transactional data processing execution mode |
US20160299712A1 (en) * | 2015-04-07 | 2016-10-13 | Microsoft Technology Licensing, Llc | Virtual Machines Backed by Host Virtual Memory |
US9729677B2 (en) * | 2015-04-28 | 2017-08-08 | David Wei Ge | Method of adding client server automation to computer languages for cloud computing |
CN106502745B (zh) * | 2016-10-26 | 2019-12-10 | 腾讯科技(深圳)有限公司 | 一种函数调用方法和装置 |
-
2017
- 2017-08-15 CN CN201710698756.1A patent/CN107291480B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1811717A (zh) * | 2006-01-10 | 2006-08-02 | 杭州东信灵通电子实业公司 | 通用进程间通信实现方法 |
CN101051276A (zh) * | 2007-05-15 | 2007-10-10 | 东南大学 | 嵌入式微处理器的存储子系统内存自动布局方法 |
CN101187881A (zh) * | 2007-12-03 | 2008-05-28 | 浙江大学 | 一种用于处理器仿真模型中的系统调用转换直通通道方法 |
US9690709B2 (en) * | 2014-07-14 | 2017-06-27 | Oracle International Corporation | Variable handles |
CN106649105A (zh) * | 2016-12-08 | 2017-05-10 | 武汉斗鱼网络科技有限公司 | 一种内存泄漏的检测方法和装置 |
CN106991328A (zh) * | 2017-03-30 | 2017-07-28 | 兴华永恒(北京)科技有限责任公司 | 一种基于动态内存指纹异常分析的漏洞利用检测识别方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107291480A (zh) | 2017-10-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107291480B (zh) | 一种函数调用方法及装置 | |
CN109976761B (zh) | 软件开发工具包的生成方法、装置及终端设备 | |
Sen et al. | Jalangi: A selective record-replay and dynamic analysis framework for JavaScript | |
KR101786156B1 (ko) | 사용자 정의 타입을 위한 컴파일 타임 경계 검사 기법 | |
CN111399990B (zh) | 解释执行智能合约指令的方法及装置 | |
KR20150024842A (ko) | 적응식 이식가능 라이브러리 | |
US8997066B2 (en) | Emulating pointers | |
JPH0836488A (ja) | ダイナミック・パッチングを使用するランタイム・エラー・チェック方法と装置 | |
CN110825386B (zh) | 代码的编译方法和装置、存储介质 | |
CN104246695A (zh) | 嵌套仿真和动态链接环境 | |
CN101782868A (zh) | 一种用于对本地方法调用进行性能测试的方法和装置 | |
CN110673837B (zh) | 代码修复方法及装置、电子设备、计算机可读存储介质 | |
CN115629971A (zh) | 一种应用的开发系统和开发方法 | |
CN103677778A (zh) | 一种CAP文件Classref常量的解析方法 | |
US7409677B1 (en) | Method and system for creation and use of embedded trace description | |
US9047403B2 (en) | Debugger with previous version feature | |
US8769498B2 (en) | Warning of register and storage area assignment errors | |
US9141356B2 (en) | Process for generating dynamic type | |
CN117075960B (zh) | 程序重构方法、应用跨平台迁移方法、装置与计算设备 | |
Kang | Function call interception techniques | |
Bilgin | Mastering Cross-Platform Development with Xamarin | |
CN111666102A (zh) | 文件格式转换方法、芯片验证方法、相关装置及网络芯片 | |
Jung et al. | Performance characterization of prelinking and preloadingfor embedded systems | |
CN115456628A (zh) | 基于区块链的智能合约查看方法、装置、存储介质及设备 | |
CN112306539B (zh) | 一种单片机应用层开发方法、系统、终端及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20221107 Address after: 100005 No. 69, inner main street, Dongcheng District, Beijing, Jianguomen Patentee after: AGRICULTURAL BANK OF CHINA Patentee after: Agricultural Bank of China Financial Technology Co.,Ltd. Address before: 100005 No. 69, inner main street, Dongcheng District, Beijing, Jianguomen Patentee before: AGRICULTURAL BANK OF CHINA |