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