是什么决定了程序进行哪些系统调用?

What determines which system calls a program makes?

所以我有一个 C/C++ 程序,它不 运行 某个计算机系统模拟器,因为它进行的系统调用未在该模拟器中实现。现在我想知道是什么决定了程序进行的系统调用。它只是编译器吗?或做 OS 之类的事情,硬件也发挥作用。模拟器在 ubuntu 14.04 上进行了测试,所以我想知道在 ubuntu 14.04 系统上编译程序是否会产生程序发出的不同系统调用?

一些上下文信息: 我自己的电脑是 运行ning Windows 10(64 位),我正在使用 wsl 终端在 VS 代码中编译程序。我想 运行 在名为 Multi2Sim 的计算机系统模拟器上运行此程序。我 运行 在我的 windows 计算机上的 docker 容器中安装这个模拟器。当在 docker 集装箱码头 运行ning lsb_release -a 时,它产生 ubuntu 14.04。该程序不在模拟器上 运行,因为它进行了系统调用 getdents64(),但尚未在模拟器中实现。

模拟器在 ubuntu 14.04 上进行了测试,所以我在想如果我在那个 os 上编译它可能会改变系统调用。我使用了 -m32 标志,因为模拟器不支持 64 位 ELF 文件。

一些输出显示了运行正在使用的编译器等版本: 当 运行ning uname -a 在容器中时,我得到:

Linux 66510ea7ce2e 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

g++ --version 在我的 windows 计算机上的 wsl 终端:

g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609

g++ -dumpmachine 在我的 windows 计算机上的 wsl 终端:

x86_64-linux-gnu

生成文件:

TARGET =    bandwidth

.PHONY: all clean $(TARGET)

# directories
INC_DIR = ../include
KERN_DIR = ../kernels
CMN_DIR = ../common
OBJ_DIR = obj


# compiler flags
CXX = g++
CXXFLAGS = -m32 -O3 -fopenmp -march=native -I$(INC_DIR) -std=c++14 $(USER_DEFS)


# header files
HEADERS = $(wildcard $(INC_DIR)/*.h)


# src files
SRC = $(wildcard *.cpp) $(wildcard $(KERN_DIR)/*.cpp) $(wildcard $(CMN_DIR)/*.cpp)

# object files
OBJ = $(SRC:.cpp=.o)

all: $(TARGET)
    
clean:
    @rm -rf $(OBJ)
    @rm -rf $(TARGET)
    @echo "Cleaned..."
    
%.o: %.cpp $(HEADERS)
    $(CXX) $(CXXFLAGS) -c -o $@ $<

$(TARGET): $(OBJ)
    $(CXX) $(CXXFLAGS) $^ -o $@```

What determines which system calls a program makes?

程序的源代码。 整个 程序包括所有链接在一起的编译源。包括您未明确指定的那些,最值得注意的是大多数系统调用将直接发起的 C 系统库。如果是 Ubuntu,那就是 glibc。当然,其他调用系统库函数的源也会间接影响系统调用。

Is it only the compiler

当然 不仅仅是 编译器,但它也负责其中一些间接调用。例如,如果您编写 new X,那么编译器会生成对 malloc 的调用,其实现调用 sbrkmmap,其实现执行系统调用。

我是这样理解题中信息的:

  • 您在真实 Windows 系统上的虚拟 Ubuntu 系统 (WSL) 中编译程序。 - 你 运行 Ubuntu (WSL) 在你真正的 Windows 系统上的 docker 容器中。
  • 在这个虚拟 Ubuntu (WSL) 中,您 运行 Multi2Sim 应该模拟 Linux ABI。

根据文档,系统调用的模拟似乎不完整。请参阅
中的2.3 编译和模拟您自己的源代码部分 http://www.multi2sim.org/downloads/m2s-guide-4.2.pdf,

系统调用 getdents64()getdents() 不是关于 64 位处理器架构,而是关于内核对大型文件系统的支持。

引用 https://man7.org/linux/man-pages/man2/getdents64.2.html :

Library support for getdents64() was added in glibc 2.30

使用旧版本的 glibc 库编译和静态 link 您的程序可能会有所帮助。