Skip to content

Latest commit

 

History

History
32 lines (14 loc) · 3.21 KB

runtime_boring.go.md

File metadata and controls

32 lines (14 loc) · 3.21 KB

File: runtime_boring.go

runtime_boring.go是Go语言标准库中的一个文件,其作用是为支持一种特殊的编译器(boringcompiler)而存在的。

boringcompiler是一个基于LLVM的Go语言编译器,用于编译Go程序到LLVM IR并进行优化和代码生成。由于boringcompiler的优化和代码生成方式与Go语言标准库中其他编译器(如gc)略有不同,因此需要特别处理一些运行时函数和数据结构。而runtime_boring.go就是用于实现这些特别处理的。

在runtime_boring.go中,定义了一些函数和数据结构,在编译器优化和代码生成过程中使用。例如,其中包括了一些函数实现用于支持boringcompiler生成的IR代码,还有通过编译器标志开启的一些特殊功能的实现。此外,它还包括一些与调试相关的代码,以帮助用户在调试boringcompiler生成的程序时进行调试工作。

总的来说,runtime_boring.go的作用是为Go语言的boringcompiler提供一些特殊的运行时函数和数据结构,从而使得在LLVM IR中生成、优化和生成的Go程序能够正常运行。

Functions:

boring_runtime_arg0

boring_runtime_arg0是在运行时中用于处理命令行参数的函数。它的作用是将命令行参数转换成Go的字符串数组,然后将该数组作为程序的第一个参数传递给实际的main函数。在Go的标准库中,这个操作是由内部的main函数处理的,但是在Boring Go中,由于其各种限制和特殊要求,需要手动实现该函数。

该函数主要由两个部分组成:第一部分是将C语言的命令行参数转换成Go的字符串,第二部分是将这些字符串复制到Go的内存中,以便将它们传递给实际的main函数。

在第一部分中,通过C语言的main函数传递给程序的argc和argv参数,我们可以获取到命令行参数的数量和各个参数的指针。接着,我们可以循环遍历这些指针,读取每个参数的值,并将其转换成Go的字符串。

在第二部分中,我们需要将这些字符串复制到Go的内存中。为了实现这个目标,我们首先需要计算总共需要多少空间来存储这些字符串。然后,我们在Go的堆上为这些字符串分配空间,并且将它们依次复制到对应的地址上。最后,我们将这些字符串的地址存储在一个Go的slice中,并将该slice作为程序的第一个参数传递给实际的main函数。

总之,boring_runtime_arg0是在Boring Go中用于将命令行参数转换成Go的字符串数组的函数。真正的main函数会从这个字符串数组中获取实际的命令行参数,并执行相应的操作。

fipstls_runtime_arg0

fipstls_runtime_arg0是在Go语言运行时中用于获取当前进程二进制文件路径的函数。在Linux系统上,/proc/self/exe是一个包含当前进程可执行二进制文件路径的符号链接,而fipstls_runtime_arg0函数就是通过读取该符号链接获取当前进程的二进制文件路径。该函数的作用在于提供一个快速的方式获取二进制文件路径,可以用于一些需要知道二进制文件路径的场景,比如编写自动化测试工具、日志记录以及诊断工具等等。