C++ 什么决定了程序调用哪个系统?

C++ 什么决定了程序调用哪个系统?,c++,c,ubuntu,system-calls,C++,C,Ubuntu,System Calls,所以我有一个C/C++程序,它不运行某个计算机系统模拟器,因为它进行的系统调用没有在该模拟器中实现。现在我想知道是什么决定了程序的系统调用。它只是编译器吗?或者像操作系统和硬件这样的东西也起作用。模拟器是在Ubuntu14.04上测试的,所以我想知道在Ubuntu14.04系统上编译程序是否会产生不同的系统调用 一些上下文信息: 我自己的计算机运行的是Windows 10(64位),我正在使用wsl终端用VS代码编译一个程序。我想在名为Multi2Sim的计算机系统模拟器上运行这个程序。我正在w

所以我有一个C/C++程序,它不运行某个计算机系统模拟器,因为它进行的系统调用没有在该模拟器中实现。现在我想知道是什么决定了程序的系统调用。它只是编译器吗?或者像操作系统和硬件这样的东西也起作用。模拟器是在Ubuntu14.04上测试的,所以我想知道在Ubuntu14.04系统上编译程序是否会产生不同的系统调用

一些上下文信息: 我自己的计算机运行的是Windows 10(64位),我正在使用wsl终端用VS代码编译一个程序。我想在名为Multi2Sim的计算机系统模拟器上运行这个程序。我正在windows计算机上的docker容器中运行此模拟器。在docker containers terminal中运行
lsb_release-a
时,它会生成
Ubuntu14.04
。该程序不会在模拟器上运行,因为它使系统调用getdents64(),而该调用尚未在模拟器中实现

模拟器在Ubuntu14.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
在wsl终端的windows计算机上:

g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
x86_64-linux-gnu
g++-dumpmachine
在wsl终端中的我的windows计算机上:

g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
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 $@```
TARGET=带宽
.虚假:全部清洁美元(目标)
#目录
INC_DIR=../include
KERN_DIR=../kernels
CMN_DIR=../common
OBJ_DIR=OBJ
#编译器标志
CXX=g++
CXXFLAGS=-m32-O3-fopenmp-march=native-I$(INC\u DIR)-std=c++14$(用户定义)
#头文件
标题=$(通配符$(INC_DIR)/*.h)
#src文件
SRC=$(通配符*.cpp)$(通配符$(KERN\u DIR)/*.cpp)$(通配符$(CMN\u DIR)/*.cpp)
#对象文件
OBJ=$(SRC:.cpp=.o)
全部:$(目标)
清洁:
@rm-rf$(OBJ)
@rm-rf$(目标)
@echo“已清理…”
%.o:%.cpp$(标题)
$(CXX)$(CXXFLAGS)-c-o$@$<
$(目标):$(OBJ)
$(CXX)$(CXXFLAGS)$^-o$@```
什么决定了程序调用哪个系统

程序的源代码。整个程序,包括链接在一起的所有编译源代码。包括那些您没有明确指定的,最显著的是C系统库,其中大多数系统调用将直接发起。以Ubuntu为例,这就是glibc。当然,调用系统库函数的其他源将间接影响系统调用

只是编译器吗

当然不仅仅是编译器,它还负责一些间接调用。例如,如果编写
newx
,编译器将生成对
malloc
的调用,其实现调用
sbrk
,或
mmap
其实现执行系统调用

什么决定了程序调用哪个系统

程序的源代码。整个程序,包括链接在一起的所有编译源代码。包括那些您没有明确指定的,最显著的是C系统库,其中大多数系统调用将直接发起。以Ubuntu为例,这就是glibc。当然,调用系统库函数的其他源将间接影响系统调用

只是编译器吗


当然不仅仅是编译器,它还负责一些间接调用。例如,如果您编写
new X
,编译器将生成对
malloc
的调用,其实现调用
sbrk
mmap
其实现执行系统调用。

我以这种方式理解问题中的信息:

  • 你在真实Windows系统上的虚拟Ubuntu系统(WSL)中编译你的程序您可以在真正的Windows系统上的docker容器中运行Ubuntu(WSL)
  • 在这个虚拟Ubuntu(WSL)中,您运行Multi2Sim,它应该模拟Linux ABI
根据文档,系统调用的模拟似乎不完整。请参阅
中的第2.3节编译和模拟您自己的源代码 ,

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

引用:

glibc 2.30中添加了对getdents64()的库支持


它可能有助于编译您的程序并将其与较旧版本的
glibc
库进行静态链接。

我通过以下方式理解问题中的信息:

  • 你在真实Windows系统上的虚拟Ubuntu系统(WSL)中编译你的程序您可以在真正的Windows系统上的docker容器中运行Ubuntu(WSL)
  • 在这个虚拟Ubuntu(WSL)中,您运行Multi2Sim,它应该模拟Linux ABI
根据文档,系统调用的模拟似乎不完整。请参阅
中的第2.3节编译和模拟您自己的源代码 ,

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

引用:

glibc 2.30中添加了对getdents64()的库支持


<> p> >编译和静态链接程序,使用旧版本的GLUBC/<代码>库。

取决于体系结构to.标准库实现、其他库、代码。Win需要更多上下文信息。在C或C++术语中,它是实现。实现是将源代码转换为可执行形式的过程。实际上,实现由构建链(编译器、链接器等)和trans组成