CN116974656A - 函数调用方法、装置、电子设备及存储介质 - Google Patents

函数调用方法、装置、电子设备及存储介质 Download PDF

Info

Publication number
CN116974656A
CN116974656A CN202210438860.8A CN202210438860A CN116974656A CN 116974656 A CN116974656 A CN 116974656A CN 202210438860 A CN202210438860 A CN 202210438860A CN 116974656 A CN116974656 A CN 116974656A
Authority
CN
China
Prior art keywords
file
function
memory address
symbol
determining
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.)
Pending
Application number
CN202210438860.8A
Other languages
English (en)
Inventor
谢祖庆
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202210438860.8A priority Critical patent/CN116974656A/zh
Publication of CN116974656A publication Critical patent/CN116974656A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本申请涉及一种函数调用方法、装置、电子设备及存储介质。上述方法包括响应于函数调用请求,确定对应的待调用的目标函数;在目标函数的内存地址未知的情况下,确定与目标函数属于同一文件的关联函数;基于关联函数的内存地址和文件的文件格式在内存中定位到文件的;基于文件格式在文件中定位到符号表;从符号表中确定目标函数的内存地址,以及基于目标函数的内存地址调用目标函数。本申请实施例可应用于云技术、人工智能、智慧交通、辅助驾驶等各种场景。本申请提高了确定待调用的目标函数的灵活性,进而能够以更具适应性的方式实现互联网产品的相关功能。本申请降低了对于系统API的依赖,这样可以更好的满足一些动态化的业务需求。

Description

函数调用方法、装置、电子设备及存储介质
技术领域
本申请涉及互联网通信技术领域,尤其涉及一种函数调用方法、装置、电子设备及存储介质。
背景技术
随着互联网通信技术的发展,互联网产品层出不穷。用户对于互联网产品的使用体验,一般由互联网产品的相关功能提供,而互联网产品的相关功能需要通过调用函数来实现。相关技术中,常通过静态链接的方式将待调用的目标函数与相关经编译后的源代码进行关联,以获得可执行文件。后续执行该可执行文件的过程中,调用目标函数以实现互联网产品的相关功能。然而,这样静态链接的方式也在一定程度上局限了目标函数的选择,阻拦了可能存在的用于实现互联网产品的相关功能的更优函数。
发明内容
为了解决上述提出的至少一个技术问题,本申请提供了一种函数调用方法、装置、电子设备及存储介质:
根据本申请的第一方面,提供了一种函数调用方法,所述方法包括:
响应于函数调用请求,确定对应的待调用的目标函数;
在所述目标函数的内存地址未知的情况下,确定与所述目标函数属于同一文件的关联函数;所述文件已载入内存,所述关联函数的内存地址已知;
基于所述关联函数的内存地址和所述文件的文件格式在所述内存中定位到所述文件;
基于所述文件格式在所述文件中定位到符号表;所述符号表用于记录属于所述文件的函数的信息;
从所述符号表中确定所述目标函数的内存地址,以及基于所述目标函数的内存地址调用所述目标函数。
根据本申请的第二方面,提供了一种函数调用装置,其特征在于,所述装置包括:
响应模块:用于响应于函数调用请求,确定对应的待调用的目标函数;
关联函数确定模块:用于在所述目标函数的内存地址未知的情况下,确定与所述目标函数属于同一文件的关联函数;所述文件已载入内存,所述关联函数的内存地址已知;
文件定位模块:用于基于所述关联函数的内存地址和所述文件的文件格式在所述内存中定位到所述文件;
符号表定位模块:用于基于所述文件格式在所述文件中定位到符号表;所述符号表用于记录属于所述文件的函数的信息;
函数调用模块:用于从所述符号表中确定所述目标函数的内存地址,以及基于所述目标函数的内存地址调用所述目标函数。
根据本申请的第三方面,提供了一种电子设备,所述电子设备包括至少一个处理器,以及与所述至少一个处理器通信连接的存储器;其中,所述存储器中存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由所述至少一个处理器加载并执行以实现如第一方面所述的函数调用方法。
根据本申请的第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由处理器加载并执行以实现如第一方面所述的函数调用方法。
根据本申请的第五方面,提供了一种计算机程序产品,所述计算机程序产品包括至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由处理器加载并执行以实现如第一方面所述的函数调用方法。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本申请。
实施本申请,具有以下有益效果:
本申请借助属于同一文件的已知内存地址的关联函数,从文件的符号表中确定目标函数的内存地址,以实现针对目标函数的灵活调用。相较于相关技术中的静态链接的方式,本申请提高了确定待调用的目标函数的灵活性,进而能够以更具适应性的方式实现互联网产品的相关功能。同时,本申请降低了对于系统API的依赖,可以不需要依赖其以确定目标函数的内存地址,这样可以更好的满足一些动态化的业务需求。
根据下面参考附图对示例性实施例的详细说明,本申请的其它特征及方面将变得清楚。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案和优点,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它附图。
图1示出根据本申请实施例的一种应用环境示意图;
图2示出根据本申请实施例的一种函数调用方法的流程示意图;
图3示出根据本申请实施例的一种定位符号表的流程示意图;
图4示出根据本申请实施例的基于所述第二内存地址定位符号表的流程示意图;
图5示出根据本申请实施例的定位模块的示意图;
图6示出根据本申请实施例的Mach-O文件的组成示意图;
图7示出根据本申请实施例的Mach-O文件的组成示意图;
图8示出根据本申请实施例的有关滑动距离的示意图;
图9示出根据本申请实施例的符号表的组成示意图;
图10也示出根据本申请实施例的一种函数调用方法的流程示意图;
图11示出根据本申请实施例的装置框图;
图12示出根据本申请实施例的电子设备示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或服务器不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
以下将参考附图详细说明本申请的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
另外,为了更好地说明本申请,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本申请同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本申请的主旨。
对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。
Mach-O(Mach Object):它是苹果平台(MacOS、iOS)上可执行文件、动态库、目标文件等文件的标准格式。
API(Application Programming Interface):应用程序接口,它是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。
OC(Objective-C):它是C语言的继承,主要是一种用于开发苹果公司的应用程序的编程语言。
Compile:编译,将源代码(文本)生成目标文件(二进制文件)的过程。
Object File:目标文件(.o),编译生成的产物,是一种二进制文件格式,但是还不能直接运行。
Link:链接将编译生成的所有目标文件合并成一个可执行文件(ExecutableFile)。
Linker:链接器,即执行链接过程的程序,分为静态链接器(简称链接器)和动态链接器,静态链接器负责将目标文件链接生成可执行文件或者动态库,而动态链接器(Dynamic Linker)负责将可执行文件和动态库加载到内存中。
Executable File:可执行文件,是多个目标文件经过链接形成的最终文件,可以直接运行,一个进程的运行从可执行文件开始。
Dynamic library:动态库,即动态链接库,是Mach-O文件的一种类型,是提供各种API的文件,给可执行文件或者其他动态库进行调用。操作系统提供给开发者使用的各种API基本是以动态库的形式提供的。
Module:模块,可执行文件或动态库的统称。
Symbol:符号,即源代码里函数和变量经过编译后形成的一种记录,一个符号包括名字、地址、属性等字段,调用系统库提供的某个函数(API)本质上就是拿到这个函数对应的符号地址,然后进行函数调用。
Symbol Table:符号表,模块中记录各种符号的一张表,简写为“SYMTAB”。
Text Segment:代码段,可执行文件或动态库中的CPU指令部分,段名为“__TEXT”。
Data Segment:数据段,可执行文件或动态库中的数据部分(比如全局变量、常量等)。
Load Address:加载地址、加载位置、内存地址,即一个模块加载到内存中的位置。
Load Command:加载命令,Mach-O文件中提供给动态链接器的加载信息,相当于整个文件的索引或目录。
Link Edit Segment:链接编辑段,是动态链接器将一个模块加载进内存中,还需要修改这个段中的一些偏移等数据,这个模块才可以正确运行,段名为“__LINKEDIT”。
请参阅图1,图1示出根据本申请实施例的应用环境示意图,应用环境中可以包括客户端10和服务器端20。客户端10与服务器端20可以通过有线或无线通信方式进行直接或间接地连接。相关对象(比如用户、模拟器)触发呈现于交互界面的控件,生成函数调用请求。交互界面是由客户端10提供的。响应于函数调用请求,客户端10确定对应的待调用的目标函数;然后,在目标函数的内存地址未知的情况下,确定与目标函数属于同一文件的关联函数;再者,基于关联函数的内存地址和文件的文件格式在内存中定位到文件;接着,基于文件格式在文件中定位到符号表;最后,从符号表中确定目标函数的内存地址,以及基于目标函数的内存地址调用目标函数。需要说明的是,图1仅仅是一种示例。
客户端10可以是智能手机、电脑(如台式电脑、平板电脑、笔记本电脑)、增强现实(augmented reality,AR)/虚拟现实(virtual reality,VR)设备、数字助理、智能语音交互设备(如智能音箱)、智能可穿戴设备、智能家电、车载终端等类型的实体设备,也可以是运行于实体设备中的软体,比如计算机程序。客户端10所对应的操作系统可以是安卓系统(Android系统)、iOS系统(是由苹果公司开发的移动操作系统)、linux系统(一种操作系统)、Microsoft Windows系统(微软视窗操作系统)等。
服务器端20可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)以及大数据和人工智能平台等基础云计算服务的云服务器。其中服务器可以包括有网络通信单元、处理器和存储器等等。服务器端20可以为对应的客户端提供后台服务。
本申请实施例提供的函数调用方案可以用于互联网产品以提供相关功能,尤其是指示动态化的业务需求的功能(比如Web页面可在线更新的需求)。互联网产品可以是浏览器产品、即时通信产品、导航产品、直播产品、电商产品等。以浏览器产品为例,浏览器产品的表现形式为应用程序,指示动态化的业务需求的功能为针对小程序的性能分析功能。可以在浏览器产品的小程序巡查系统SDK中,使用本申请实施例提供的函数调用方案来确定作为目标函数的屏幕截图API的内存地址,然后调用屏幕截图API对小程序页面进行截图,进而更好的实现针对小程序的性能分析功能。
需要说明的是,对于与用户信息存在关联关系的函数调用请求等,当本申请实施例运用到具体产品或技术中时,需要获得用户许可或者同意,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
图2示出根据本申请实施例的一种函数调用方法的流程示意图,如图2所示,该方法包括:
S201:响应于函数调用请求,确定对应的待调用的目标函数;
在本申请实施例中,函数调用请求可以是基于实现指定功能的请求信息生成的,实现指定功能的请求信息指示了用于实现指定功能的至少一个指定函数。对至少一个指定函数进行调用可以实现指定功能。当指定函数的数量大于或等于2时,实现指定功能的请求信息还指示了调用至少两个指定函数的顺序。对于这里所确定的待调用的目标函数,可以1)当指定函数的数量等于1时,确定指定函数为目标函数;2)当指定函数的数量大于或等于2时,确定至少两个指定函数中的任意一个为目标函数;3)当指定函数的数量大于或等于2时,确定至少两个指定函数均为目标函数;4)基于当前业务需求(比如时效性需求、节省资源需求等)判断是否存在针对指定函数的替代函数,若存在,则确定替代函数为目标函数。进一步的,若指定函数的数量等于1,确定至少一个替代函数均为目标函数;若指定函数的数量大于或等于2且存在针对所有指定函数的至少一个替代函数,确定至少一个替代函数均为目标函数;若指定函数的数量大于或等于2且存在针对部分指定函数的至少一个替代函数,确定至少一个替代函数均为目标函数,以及确定不存在替代函数的部分指定函数均为目标函数。
需要说明的是,若所确定的目标函数的数量大于或等于2时,对每一目标函数分别执行后续步骤S202-S205。执行顺序可以采用调用至少两个目标函数以实现指定功能的顺序。
S202:在所述目标函数的内存地址未知的情况下,确定与所述目标函数属于同一文件的关联函数;所述文件已载入内存,所述关联函数的内存地址已知;
在本申请实施例中,调用目标函数需要知道它的内存地址。在目标函数的内存地址已知的情况下,基于目标函数的内存地址调用目标函数。在目标函数的内存地址未知的情况下,需要寻找它的内存地址。可以理解,在判断目标函数的内存地址是否未知时,这里利用目标函数的名称进行查询,若查询不到,则判定目标函数的内存地址未知。
确定与目标函数属于同一文件的关联函数的过程,可以先确定包含目标函数的多个候选文件;然后,分别判断各个候选文件是否包含内存地址已知的函数;再者,确定任意一个候选文件所包含的内存地址已知的函数为关联函数。一般而言,候选文件包含多个函数,候选文件的名称与多个函数各自的名称之间的关系可以查询到。通过函数的名称可以查询其内存地址是否已知。由于包含关联函数的文件需要已载入内存,这里的判断步骤中,可以从已载入内存的第一文件中确定包含目标函数的多个候选文件。在实际应用中,文件可以是一个可执行文件,也可以是一个动态库。
S203:基于所述关联函数的内存地址和所述文件的文件格式在所述内存中定位到所述文件;
在本申请实施例中,结合前述步骤S202中的相关记载,若文件的内存地址(加载地址、加载位置)已知,那么可以跳过这里的步骤S203,而直接执行后续步骤S204-S205。而若文件的内存地址未知,则需要寻找它的内存地址。由此,这里基于关联函数的内存地址和文件的文件格式确定文件的内存地址。关联函数属于文件,利用关联函数的内存地址可以提高寻找文件的内存地址的效率。因为相较于内存地址已知的其他函数,文件的内存地址靠近关联函数的内存地址的概率更大。在此基础上,结合文件的文件格式可以更准确有效的定位到文件。
一般而言,文件的内存地址是指文件头的内存地址。若文件格式指示文件头标志,那么在内存中定位文件的过程可以包括下述步骤:首先,以所述关联函数的内存地址为起点,按照内存地址递减的顺序在所述内存中进行文件头定位,直至确定出所述文件头标志;然后,基于确定出的文件头标志在所述内存中定位到所述文件。
所述文件的首部至尾部所涉及的内存地址是按照内存地址递增的顺序来分配的。若关联函数的内存地址为0x100000101,因为关联函数不在文件头,而文件的内存地址指示文件头。那么,以所述关联函数的内存地址为起点向前查找,查找的对象为文件头标志。查找到的文件头标志的内存地址(比如0x100000011)即为文件的内存地址,从而实现了在内存中定位到文件。通过关联函数的内存地址可以粗略确定文件的内存地址,结合文件头标志则保证了确定文件的内存地址的精准度,这样可以兼顾定位文件速度和准确度。
在实际应用中,一个模块包含的系统API有成千上万个,可以通过模块内任意一个常用API(对应关联函数)的内存地址来对模块进行粗略定位,然后向前查找,一直找到这个模块的加载地址,参见图5。以模块是Mach-O文件为例,一个Mach-O文件由Mach-O文件头、若干个加载命令(load command)和后面的数据区域组成,参见图6。可以以Mach-O文件头作为查找对象、常用API的内存地址为起点向前查找,以找到这个模块的加载地址。Mach-O文件头包含了开头的magic、cpu类型、Mach-O文件类型、一些标志位等,这些值通常是固定的,通过校验这些值,可以确定这是否为一个Mach-O文件头,从而找到Mach-O文件头的加载地址,即模块的加载地址。
S204:基于所述文件格式在所述文件中定位到符号表;所述符号表用于记录属于所述文件的函数的信息;
在本申请实施例中,已在内存中定位到文件,而文件中的符号表记录属于文件的函数的信息,那么可以在文件中定位符号表,进而借助符号表来确定目标函数的内存地址。如何在文件中定位符号表,可以参考文件的文件格式实现更准确有效的定位。
在一个实施例中,如图3所示,所述文件格式指示所述文件包括链接编辑段和加载命令,所述文件格式指示定位所述加载命令的加载命令标志,所述符号表属于所述链接编辑段;所述基于所述文件格式在所述文件中定位到符号表,包括:
S301:在所述文件中确定出所述加载命令标志以定位所述加载命令;
S302:基于所述加载命令确定指示所述链接编辑段的第一内存地址、所述链接编辑段在所述文件中的第一偏移量、所述符号表在所述文件中的第二偏移量;
S303:基于所述第一偏移量与所述第二偏移量的差值,得到相对偏移量;
S304:根据所述第一内存地址和所述相对偏移量,得到指示所述符号表的第二内存地址;
S305:基于所述第二内存地址在所述文件中定位到所述符号表。
根据文件格式所指示的信息,可以知道符号表在文件中属于链接编辑段。那么可以先确定链接编辑段的内存地址,再确定符号表的内存地址,进而根据符号表的内存地址定位到符号表。
链接编辑段的内存地址可以通过加载命令确定,具体可以是确定与链接编辑段有关的第一类加载命令标志,然后在文件中确定出第一类加载命令标志以定位第一类加载命令,再者基于第一类加载命令确定指示链接编辑段的第一内存地址。
在确定链接编辑段的内存地址的基础上,需要基于符号表与链接编辑段的关联关系来确定符号表的内存地址。而符号表与链接编辑段的关联关系可以是符号表与链接编辑段的相对位置,相对位置可以指示两者在文件中的相对偏移量。链接编辑段在文件中的第一偏移量可以基于上述第一类加载命令确定。确定符号表在文件中的偏移量的过程,可以是确定与符号表有关的第二类加载命令标志,然后在文件中确定出第二类加载命令标志以定位第二类加载命令,再者基于第二类加载命令确定符号表在文件中的第二偏移量。一般而言,相对偏移量=第二偏移量—第一偏移量。相应的,可以基于第一内存地址和相对偏移量,得到指示符号表的第二内存地址。
在获知文件包括链接编辑段和加载命令,以及符号表属于链接编辑段的情况下,通过加载命令获取链接编辑段的内存地址、偏移量以及符号表的偏移量,进而获得符号表的内存地址以实现符号表的成功定位。参考文件的文件格式并据此获取位置类信息,提高了定位符号表的便捷性和效率。
在实际应用中,若文件是Mach-O文件,Mach-O文件的文件格式指示符号表位于数据区域的链接编辑段(Link Edit Segment)中,参见图7。数据区域存放了代码、常量变量、以及其他类型数据,而加载命令就是数据区域的索引信息。定位符号表需要先找到链接编辑段,然后在链接编辑段里面寻找符号表。与链接编辑段和符号表有关的加载命令如下表1所示:
表1
其中,LINKEDIT.vmaddr对应上述第一内存地址,LINKEDIT.fileoff对应上述第一偏移量,SYMTAB.symoff对应上述第二偏移量。相应的,上述相对偏移量SymbolTableOffset_In_LinkEdit=SYMTAB.symoff—LINKEDIT.fileoff。比如链接编辑段的文件偏移fileoff是100,而符号表的文件偏移symoff是150,那么符号表相对于链接编辑段的偏移就是50。而链接编辑段的内存地址vmaddr指明了该段在内存中的位置,那么符号表的内存地址SymbolTableAddress=LINKEDIT.vmaddr+SymbolTableOffset_In_LinkEdit。
上述步骤S301-S305提供的定位符号表的方式是一种较为理想的方式,以下将以此为基础提供另外两种定位符号表的方式:
一)通过调整文件的加载位置实现符号表的有效定位:
如图4所示,所述基于所述第二内存地址在所述文件中定位到所述符号表,包括:
S401:访问所述第二内存地址;
S402:在访问失败的情况下,调整所述文件的加载位置至指示所述代码段的第三内存地址,以及继续访问所述第二内存地址以在所述文件中定位到所述符号表;所述第三内存地址是基于目标加载命令设置的期望地址。
按照上述步骤S301-S304所确定的第二内存地址读取符号表,若读取成功,可以认为成功定位符号表且成功访问符号表。若读取失败(比如应用程序发生了崩溃,错误提示是EXC_BAD_ACCESS),可以认为访问符号表失败且定位符号表失败,这说明第二内存地址是不正确的。
根据文件格式所指示的信息,可以知道文件还包括代码段,代码段是文件的首部。可以是确定与代码段有关的第三类加载命令标志,然后在文件中确定出第三类加载命令标志以定位第三类加载命令,再者基于第三类加载命令确定指示代码段的第三内存地址。第三内存地址和前述第一内存地址均为期望地址,也即期望代码段、链接编辑段加载到的位置。
在已知第二内存地址不正确的情况下,造成访问失败的原因很可能是未按期望地址加载链接编辑段。通过调整文件的加载位置与第三内存地址对齐,可以实现链接编辑段的内存地址回到期望地址以使得第二内存地址为正确地址,以保证成功定位符号表。通过调整文件的加载位置来处理访问符号表失败的问题,直接高效。
在实际应用中,若文件是Mach-O文件,处理访问符号表失败的问题的过程包括打印内存地址信息以及对打印结果进行分析。将被测试的Mach-O文件的各种段的vmaddr都打印出来,64位系统下显示的结果如下:
第一次:
MachO.LoadAddress=0x102444000
TEXT.vmaddr=0x100000000
LINKEDIT.vmaddr=0x100010000
第二次:
MachO.LoadAddress=0x102904000
TEXT.vmaddr=0x100000000
LINKEDIT.vmaddr=0x100010000
从上面的数据可以看到,每次Mach-O文件的加载地址都在变化,但是代码段和链接编辑段的地址都是不变的,而且代码段和链接编辑段的地址均位于Mach-O文件的地址范围之外(在文件头的前面),所以去读取符号表时发生了内存访问越界的错误。若操作系统每次都会将Mach-O文件加载到随机的位置,而代码段(TEXT)又是Mach-O文件的第一个数据段,那么可以尝试通过系统命令将Mach-O文件的加载位置对齐到TEXT.vmaddr指定的位置(即0x100000000),再来按上面步骤计算得到的SymbolTableAddress尝试读取符号表。可以理解,通过调整文件的加载位置实现符号表的有效定位主要用于调试环境。
二)通过位置差异信息实现符号表的有效定位:
结合上述一)中的相关记载,操作系统的随机加载特性会影响符号表的成功定位。这里提出了计算期望地址与实际地址之间的位置差异,进而利用位置差异优化上述第二内存地址,以保证成功定位符号表。考虑到随机加载特性的存在,计算位置差异进而更新第二内存地址以获得新的内存地址,保证了定位符号表的适应性,也规避掉了对操作系统的干扰。
所述基于所述第二内存地址在所述文件中定位到所述符号表之前,可以包括以下步骤:首先,获取所述文件的加载位置以及指示所述代码段的第三内存地址;所述第三内存地址是基于目标加载命令设置的期望地址;然后,基于所述加载位置与所述第三内存地址之间的差异,得到位置差异信息。
相应的,利用所述位置差异信息更新所述第二内存地址,得到第四内存地址;然后,基于所述第四内存地址在所述文件中定位到所述符号表。
对于代码段、第三内存地址,可以参考上述一)中的相关记载,不再赘述。可以将文件的加载位置视作实际地址,在获取文件的加载位置之后,可以判断文件的加载位置和第三内存地址是否相同,若相同,可以访问第二内存地址以在文件中定位到符号表;若不同,可以确定文件的加载位置与第三地址之间的位置差异,然后利用位置差异更新第二内存地址以获得新的内存地址并访问。
在实际应用中,若文件是Mach-O文件,因为操作系统的随机加载特性,Mach-O文件的加载位置和代码段(TEXT)指定的vmaddr会发生一定的滑动距离Slide=MachO.LoadAddress-TEXT.vmaddr,参见图8。其中滑动距离对应上述位置差异信息。可以理解,一个模块在被静态链接器生成的时候,通常会指定一个期望被加载的内存位置,但是由于操作系统随机加载机制的存在,模块真实被加载的位置和期望被加载的位置存在一个差值,即滑动距离。因为Mach-O文件整体滑动了这个距离,所以上面计算得到的SymbolTableAddress也需要加上这个滑动距离,即最终的符号表的内存地址SymbolTableAddress=Slide+LINKEDIT.vmaddr+SymbolTableOffset_In_LinkEdit,SymbolTableAddress=MachO.LoadAddress—TEXT.vmaddr+LINKEDIT.vmaddr+SYMTAB.symoff—LINKEDIT.fileoff。
S205:从所述符号表中确定所述目标函数的内存地址,以及基于所述目标函数的内存地址调用所述目标函数。
在本申请实施例中,在定位到符号表的情况下,从符号表记录的多个属于文件的函数的信息中确定目标函数的信息,并从目标函数的信息中确定目标函数的内存地址,进而基于目标函数的内存地址实现针对目标函数的调用。
在一个实施例中,所述符号表包括由多条符号记录构成的数组和一条字符串,每一所述符号记录描述了一个符号的字符串索引以及内存地址,所述字符串记录了多个所述符号对应的名称;所述从所述符号表中确定所述目标函数的内存地址,可以包括以下步骤:
1)在所述数组中确定任意一条所述符号记录作为第一目标符号记录;
2)基于所述第一目标符号记录的字符串索引和结束标志位,在所述字符串中进行符号名称定位,得到第一候选符号名称;
3)在所述第一候选符号名称与所述目标函数相匹配的情况下,确定所述第一目标符号记录的内存地址为所述目标函数的内存地址;
4)在所述第一候选符号名称与所述目标函数不匹配的情况下,重复上述确定第一目标符号记录至得到第一候选符号名称的步骤,直至所述第一候选符号名称与所述目标函数相匹配,以及基于确定所述第一目标符号记录的内存地址为所述目标函数的内存地址。
参见图9,其示出了符号表中的数组和字符串,图中数组的每一行(除首行)对应一条符号记录。一条符号记包含的数据结构如下表2所示:
表2
可以在数组中确定任意一条所述符号记录作为第一目标符号记录,比如图9中数组的第三行。基于第一目标符号记录的字符串索引(比如图9中数组的第二行的n_strx=6)和结束标志位(比如空格),在字符串中进行符号名称定位,得到第一候选符号名称(比如“myfunction”,它是以第7个字符为起点、按照字符串索引递增的顺序在字符串中进行结束定位,并基于第7个字符与结束标志位之间的字符所得到的)。若目标函数的名称为“myfunction”,那么第一候选符号名称与目标函数相匹配,相应的,第一目标符号记录的内存地址(比如图9中数组的第二行的value=0x14000)为目标函数的内存地址。若目标函数的名称不是“myfunction”,那么第一候选符号名称与目标函数不匹配,需要继续从数组中抽取符号记录(所抽取的符号记录为首次被抽取)并获得对应的第一候选符号名称,直至所获得的第一候选符号名称与目标函数相匹配,进而确定所获得的第一候选符号名称对应的符号记录的内存地址为目标函数的内存地址。当然,若数组中每一符号记录对应的第一候选符号名称均与目标函数不匹配,则生成指示内存地址确定失败的第一信息。
确定目标函数的内存地址可以通过针对数组的遍历查找来实现。参见图9,以目标函数的名称为“myfunction”为例,从第一行开始遍历,从第一行获知n_strx=17,查字符串17开始到结束之间的字符串是“hi”,这不是要找的符号。继续从第二行获知n_strx=0,查字符串0开始到结束之间的字符串是“hello”,这也不是要找的符号。继续从第二行获知n_strx=6,查字符串6开始到结束之间的字符串是“myfunction”,这是要找的符号,这个符号的地址是n_value=0x14000。
在实际应用中,结合前述步骤S204中的相关记载,字符串表的内存地址StringTableAddress=MachO.LoadAddress—TEXT.vmaddr+LINKEDIT.vmaddr+SYMTAB.stroff—LINKEDIT.fileoff。根据符号记录,可以得到符号的名字SymbolName=StringTableAddress+n_strx。然后将该名字和目标函数的名称进行比较,如果相同并且符号是导出类型的,则这个符号就是要找的符号,否则继续查找下一条符号记录,直到最后一条符号记录。若找到满足上述要求的符号记录,则这个目标函数的内存地址TargetSymbolAddress=n_value+Slide=n_value+MachO.LoadAddress-TEXT.vmaddr。
进一步的,所述从所述符号表中确定所述目标函数的内存地址之前,可以包括以下步骤:首先,在所述数组中确定任意一条所述符号记录作为第二目标符号记录;然后,基于所述第二目标符号记录的字符串索引和结束标志位,在所述字符串中进行符号名称定位,得到第二候选符号名称;再者,在所述第二候选符号名称与所述关联函数不匹配的情况下,重复上述确定第二目标符号记录至得到第二候选符号名称的步骤,直至所述第二候选符号名称与所述关联函数相匹配,以及当所述第二目标符号记录的内存地址与所述关联函数的内存地址不同时,以及生成指示文件定位失败的第二信息。
可以在数组中确定任意一条所述符号记录作为第二目标符号记录,比如图9中数组的第二行。基于第二目标符号记录的字符串索引(比如图9中数组中第二行的n_strx=0)和结束标志位(比如空格),在字符串中进行符号名称定位,得到第二候选符号名称(比如“hello”,它是以第1个字符为起点、按照字符串索引递增的顺序在字符串中进行结束定位,并基于第1个字符与结束标志位之间的字符所得到的)。
若关联函数的名称为“hello”、关联函数的内存地址为0x12000,那么第二候选符号名称与关联函数相匹配且第二目标符号记录的内存地址(比如图9中数组的第二行的value=0x12000)与关联函数的内存地址相同,可以触发所述从所述符号表中确定所述目标函数的内存地址的步骤。
若关联函数的名称不是“hello”,那么第二候选符号名称与关联函数不匹配,需要继续从数组中抽取符号记录(所抽取的符号记录为首次被抽取)并获得对应的第二候选符号名称,直至所获得的第二候选符号名称与关联函数相匹配,进而确定所获得的第二候选符号名称对应的符号记录的内存地址。若该内存地址与关联函数的内存地址不同,则生成指示文件定位失败的第二信息。需要说明的是,在判断符号记录的内存地址与关联函数的内存地址是否相同时,需要考虑操作系统的随机加载特性。
在利用符号表确定目标函数的内存地址之前,借助已知内存地址的关联函数验证符号表,以保证后续利用符号表来确定目标函数的内存地址的有效性。因为根据文件格式定位到的文件可能有问题,比如定位用到的标志正好与其他文件的相关数据匹配上了。
在另一个实施例中,所述从所述符号表中确定所述目标函数的内存地址之后,可以包括以下步骤:首先,响应于函数更新指令,确定对应的样本函数;然后,获取所述样本函数的内存地址,利用所述样本函数的内存地址替换所述目标函数的内存地址,以建立所述样本函数的内存地址与所述目标函数的关联关系;或者,删除存放于所述目标函数的内存地址的所述目标函数,以及在所述目标函数的内存地址存放所述样本函数。
结合前述步骤S201中提及的替代函数,可以基于替代函数的确定而触发生成函数更新指令。当然,函数更新指令也可以是针对实现指定功能的静态分析场景下所确定的。相应的,替代函数可以是样本函数中的一类。
若目标函数为函数1、目标函数的内存地址为地址1、样本函数为函数2、样本函数的内存地址为地址2。经函数更新,利用地址2替换地址1,以建立地址2与函数1的关联关系。这样后续调用函数1的实质将为调用函数2。对于样本函数的内存地址的获取,也可以参考本申请获取目标函数的内存地址的方式。结合上述数组与字符串的示例,若目标函数的名称为“myfunction”,目标函数的地址是n_value=0x14000,样本函数的名称为“hello”、样本函数的地址是value=0x12000。经函数更新,目标函数的名称为“myfunction”,目标函数的地址是n_value=0x12000,也即修改目标函数的原地址使其指向样本函数。若目标函数为函数1、目标函数的内存地址为地址1、样本函数为函数2。经函数更新,地址1存放的函数为函数2,而不再是函数1。此外,也可以将函数1存放至除地址1之外的其他地址。通过函数更新可以提高函数相关应用的灵活性,比如hook系统API。
本申请实施例所提供的函数调用方法本质上可以视作一种符号解析方法。如图10所示,解析一个目标符号(对应目标函数)的地址时,通过与目标符号同模块的任意一个常用符号(对应关联函数)入手,通过向前匹配Mach-O文件头来找到目标符号所属模块的加载地址。然后根据Mach-O文件的文件格式来找到符号表,而符号表位于链接编辑段中,所以需要通过一系列的地址计算才能找到符号表的位置。而且由于操作系统随机加载机制的存在,整个Mach-O文件的位置会相对于代码段(TEXT)指定的位置有个滑动距离(Slide),因此得到的符号表位置和找到的符号地址都需要加上Slide。
由以上本申请实施例提供的技术方案可见,本申请实施例借助属于同一文件的已知内存地址的关联函数,从文件的符号表中确定目标函数的内存地址,以实现针对目标函数的灵活调用。相较于相关技术中的静态链接的方式,本申请提高了确定待调用的目标函数的灵活性,进而能够以更具适应性的方式实现互联网产品的相关功能。同时,本申请降低了对于系统API的依赖,可以不需要依赖其以确定目标函数的内存地址,这样可以更好的满足一些动态化的业务需求。目标函数可以是任意函数,则保证了对于动态化的业务需求的满足。
本申请实施例还提供了一种函数调用装置,如图11所示,该函数调用装置1100包括:
响应模块1101:用于响应于函数调用请求,确定对应的待调用的目标函数;
关联函数确定模块1102:用于在所述目标函数的内存地址未知的情况下,确定与所述目标函数属于同一文件的关联函数;所述文件已载入内存,所述关联函数的内存地址已知;
文件定位模块1103:用于基于所述关联函数的内存地址和所述文件的文件格式在所述内存中定位到所述文件;
符号表定位模块1104:用于基于所述文件格式在所述文件中定位到符号表;所述符号表用于记录属于所述文件的函数的信息;
函数调用模块1105:用于从所述符号表中确定所述目标函数的内存地址,以及基于所述目标函数的内存地址调用所述目标函数。
需要说明的,所述装置实施例中的装置与方法实施例基于同样的发明构思。
在一些实施例中,本申请实施例提供的装置具有的功能或包含的模块可以用于执行上文方法实施例描述的方法,其具体实现可以参照上文方法实施例的描述,为了简洁,这里不再赘述。
本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由处理器加载并执行以实现上述方法。计算机可读存储介质可以是非易失性计算机可读存储介质。
本申请实施例还提供了一种电子设备,所述电子设备包括至少一个处理器,以及与所述至少一个处理器通信连接的存储器;其中,所述存储器中存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由所述至少一个处理器加载并执行以实现上述方法。
电子设备可以被提供为终端、服务器或其它形态的设备。
图12示出根据本申请实施例的一种电子设备的框图。例如,电子设备1900可以被提供为一服务器。参照图12,电子设备1900包括处理组件1922,其进一步包括一个或多个处理器,以及由存储器1932所代表的存储器资源,用于存储可由处理组件1922的执行的指令,例如应用程序。存储器1932中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件1922被配置为执行指令,以执行上述方法。
电子设备1900还可以包括一个电源组件1926被配置为执行电子设备1900的电源管理,一个有线或无线网络接口1950被配置为将电子设备1900连接到网络,和一个输入输出(I/O)接口1958。电子设备1900可以操作基于存储在存储器1932的操作系统,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM或类似。
在示例性实施例中,还提供了一种非易失性计算机可读存储介质,例如包括计算机程序指令的存储器1932,上述计算机程序指令可由电子设备1900的处理组件1922执行以完成上述方法。
本申请可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本申请的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本申请操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,上述编程语言包括面向对象的编程语言—诸如Smalltalk、C+等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本申请的各个方面。
这里参照根据本申请实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本申请的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本申请的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,上述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标准的功能也可以以不同于附图中所标准的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本申请的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

Claims (12)

1.一种函数调用方法,其特征在于,所述方法包括:
响应于函数调用请求,确定对应的待调用的目标函数;
在所述目标函数的内存地址未知的情况下,确定与所述目标函数属于同一文件的关联函数;所述文件已载入内存,所述关联函数的内存地址已知;
基于所述关联函数的内存地址和所述文件的文件格式在所述内存中定位到所述文件;
基于所述文件格式在所述文件中定位到符号表;所述符号表用于记录属于所述文件的函数的信息;
从所述符号表中确定所述目标函数的内存地址,以及基于所述目标函数的内存地址调用所述目标函数。
2.根据权利要求1所述的方法,其特征在于,所述文件格式指示所述文件包括链接编辑段和加载命令,所述文件格式指示定位所述加载命令的加载命令标志,所述符号表属于所述链接编辑段;
所述基于所述文件格式在所述文件中定位到符号表,包括:
在所述文件中确定出所述加载命令标志以定位所述加载命令;
基于所述加载命令确定指示所述链接编辑段的第一内存地址、所述链接编辑段在所述文件中的第一偏移量、所述符号表在所述文件中的第二偏移量;
基于所述第一偏移量与所述第二偏移量的差值,得到相对偏移量;
根据所述第一内存地址和所述相对偏移量,得到指示所述符号表的第二内存地址;
基于所述第二内存地址在所述文件中定位到所述符号表。
3.根据权利要求2所述的方法,其特征在于,
所述文件格式还指示所述文件包括代码段,所述代码段是所述文件的首部;
所述基于所述第二内存地址在所述文件中定位到所述符号表,包括:
访问所述第二内存地址;
在访问失败的情况下,调整所述文件的加载位置至指示所述代码段的第三内存地址,以及继续访问所述第二内存地址以在所述文件中定位到所述符号表;所述第三内存地址是基于目标加载命令设置的期望地址。
4.根据权利要求2所述的方法,其特征在于:
所述文件格式还指示所述文件包括代码段,所述代码段是所述文件的首部;
所述基于所述第二内存地址在所述文件中定位到所述符号表之前,包括:
获取所述文件的加载位置以及指示所述代码段的第三内存地址;所述第三内存地址是基于目标加载命令设置的期望地址;
基于所述加载位置与所述第三内存地址之间的差异,得到位置差异信息;
所述基于所述第二内存地址在所述文件中定位到所述符号表,包括:利用所述位置差异信息更新所述第二内存地址,得到第四内存地址;
基于所述第四内存地址在所述文件中定位到所述符号表。
5.根据权利要求1-4任意一项所述的方法,其特征在于,所述符号表包括由多条符号记录构成的数组和一条字符串,每一所述符号记录描述了一个符号的字符串索引以及内存地址,所述字符串记录了多个所述符号对应的名称;
所述从所述符号表中确定所述目标函数的内存地址,包括:
在所述数组中确定任意一条所述符号记录作为第一目标符号记录;
基于所述第一目标符号记录的字符串索引和结束标志位,在所述字符串中进行符号名称定位,得到第一候选符号名称;
在所述第一候选符号名称与所述目标函数相匹配的情况下,确定所述第一目标符号记录的内存地址为所述目标函数的内存地址;
在所述第一候选符号名称与所述目标函数不匹配的情况下,重复上述确定第一目标符号记录至得到第一候选符号名称的步骤,直至所述第一候选符号名称与所述目标函数相匹配,以及基于确定所述第一目标符号记录的内存地址为所述目标函数的内存地址。
6.根据权利要求5所述的方法,其特征在于,所述从所述符号表中确定所述目标函数的内存地址之前,包括:
在所述数组中确定任意一条所述符号记录作为第二目标符号记录;
基于所述第二目标符号记录的字符串索引和结束标志位,在所述字符串中进行符号名称定位,得到第二候选符号名称;
在所述第二候选符号名称与所述关联函数不匹配的情况下,重复上述确定第二目标符号记录至得到第二候选符号名称的步骤,直至所述第二候选符号名称与所述关联函数相匹配,以及当所述第二目标符号记录的内存地址与所述关联函数的内存地址不同时,以及生成指示文件定位失败的第二信息。
7.根据权利要求1-4任意一项所述的方法,其特征在于,所述从所述符号表中确定所述目标函数的内存地址之后,包括:
响应于函数更新指令,确定对应的样本函数;
获取所述样本函数的内存地址,利用所述样本函数的内存地址替换所述目标函数的内存地址,以建立所述样本函数的内存地址与所述目标函数的关联关系;
或者,删除存放于所述目标函数的内存地址的所述目标函数,以及在所述目标函数的内存地址存放所述样本函数。
8.根据权利要求1-4任意一项所述的方法,其特征在于,所述文件格式指示文件头标志;
所述基于所述关联函数的内存地址和所述文件的文件格式在所述内存中定位到所述文件,包括:
以所述关联函数的内存地址为起点,按照内存地址递减的顺序在所述内存中进行文件头定位,直至确定出所述文件头标志;所述文件的首部至尾部所涉及的内存地址是按照内存地址递增的顺序来分配的;
基于确定出的文件头标志在所述内存中定位到所述文件。
9.一种函数调用装置,其特征在于,所述装置包括:
响应模块:用于响应于函数调用请求,确定对应的待调用的目标函数;
关联函数确定模块:用于在所述目标函数的内存地址未知的情况下,确定与所述目标函数属于同一文件的关联函数;所述文件已载入内存,所述关联函数的内存地址已知;
文件定位模块:用于基于所述关联函数的内存地址和所述文件的文件格式在所述内存中定位到所述文件;
符号表定位模块:用于基于所述文件格式在所述文件中定位到符号表;所述符号表用于记录属于所述文件的函数的信息;
函数调用模块:用于从所述符号表中确定所述目标函数的内存地址,以及基于所述目标函数的内存地址调用所述目标函数。
10.一种电子设备,其特征在于,所述电子设备包括至少一个处理器,以及与所述至少一个处理器通信连接的存储器;其中,所述存储器中存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由所述至少一个处理器加载并执行以实现如权利要求1-8任意一项所述的函数调用方法。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由处理器加载并执行以实现如权利要求1-8任意一项所述的函数调用方法。
12.一种计算机程序产品,其特征在于,所述计算机程序产品包括至少一条指令或至少一段程序,所述至少一条指令或至少一段程序由处理器加载并执行以实现如权利要求1-8任意一项所述的函数调用方法。
CN202210438860.8A 2022-04-22 2022-04-22 函数调用方法、装置、电子设备及存储介质 Pending CN116974656A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210438860.8A CN116974656A (zh) 2022-04-22 2022-04-22 函数调用方法、装置、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210438860.8A CN116974656A (zh) 2022-04-22 2022-04-22 函数调用方法、装置、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN116974656A true CN116974656A (zh) 2023-10-31

Family

ID=88477224

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210438860.8A Pending CN116974656A (zh) 2022-04-22 2022-04-22 函数调用方法、装置、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN116974656A (zh)

Similar Documents

Publication Publication Date Title
CN104657140B (zh) 代码生成方法及装置
CN105183760A (zh) 一种网页组件加载方法和装置
US7680668B2 (en) Method for generating a language-independent regression test script
CN112463256A (zh) 确定配置文件的方法、系统、电子设备及存储介质
US9696973B1 (en) Compilation cache with imports scanner
US10747514B2 (en) Reduced save and restore instructions for call-clobbered registers
CN113641873B (zh) 数据处理方法、装置、电子设备及可读存储介质
CN116661808B (zh) 二进制翻译方法、装置、电子设备及存储介质
CN106502707B (zh) 代码生成方法及装置
CN111240790A (zh) 一种应用的多语言适配方法、装置、客户端和存储介质
US10606612B2 (en) Context check bypass to enable opening shared-object libraries
CN116974656A (zh) 函数调用方法、装置、电子设备及存储介质
CN112925561B (zh) 一种软件开发方法、装置、计算机设备及存储介质
CN115705294B (zh) 用于获取函数调用信息的方法、装置、电子设备和介质
CN110968500A (zh) 一种测试用例的执行方法及装置
CN112084046B (zh) 一种分布式计算中泛化接口调用方法及装置
CN112000573B (zh) 代码质量的监控方法、装置、计算机设备及介质
CN114115908A (zh) 一种指令集生成、程序解析方法装置、设备以及存储介质
CN109635175B (zh) 页面数据拼接方法、装置、可读存储介质和电子设备
US10671397B2 (en) Reduced save and restore instructions for call-clobbered registers
CN112887328A (zh) 一种样本检测方法、装置、设备及计算机可读存储介质
CN111538651A (zh) 接口测试方法、装置、服务器及存储介质
CN112068814A (zh) 可执行文件的生成方法、装置、系统及介质
CN113590088B (zh) 一种自动分析组件使用情况的方法、装置和电子设备
CN113360184B (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