所以我有一个 C/C++ 程序,它不运行某个计算机系统模拟器,因为它进行了一个未在该模拟器中实现的系统调用。现在我想知道是什么决定了程序的系统调用。它只是编译器吗?或做诸如操作系统和硬件之类的事情也起作用。模拟器在 ubuntu 14.04 上进行了测试,所以我想知道在 ubuntu 14.04 系统上编译程序是否会产生程序进行的不同系统调用?
一些上下文信息:
我自己的计算机运行的是 Windows 10(64 位),我正在使用 wsl 终端在 VS 代码中编译一个程序。我想在一个名为 Multi2Sim 的计算机系统模拟器上运行这个程序。我在我的 Windows 计算机上的 docker 容器中运行这个模拟器。运行时lsb_release -a
在 docker 容器终端中,它产生 ubuntu 14.04
.该程序无法在模拟器上运行,因为它会调用尚未在模拟器中实现的系统调用 getdents64()。
模拟器在 ubuntu 14.04 上进行了测试,所以我想如果我在那个操作系统上编译它会改变系统调用。我用了-m32
标志,因为模拟器不支持 64 位 ELF 文件。
一些输出显示了我正在运行的编译器等版本:
运行时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
的调用其实现调用 sbrk
或 mmap
其实现进行系统调用。
关于c++ - 是什么决定了程序进行哪些系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66368483/