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

标签 c++ c ubuntu system-calls

所以我有一个 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 的调用其实现调用 sbrkmmap其实现进行系统调用。

关于c++ - 是什么决定了程序进行哪些系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66368483/

相关文章:

c - SDL 左控件 keydown 事件在释放键时触发

由于软件包安装,从 UBUNTU 运行 R 脚本失败

c++ - GTIFWriteKeys 和 GTIFKeySet libgeotiff 函数 (C++) 的返回值表示什么?

c++ - 确定一个 vector 是否是另一个 vector 的子集的有效方法?

c - 适用于 x86_64 的 Windows 的免费编译器

c - 如何在c中按字符位置拆分字符串

python - Ubuntu : Unable to correct problems, 你有损坏的包

eclipse - Ubuntu Linux 12.10 上的 App Engine 和 Eclipse

c++ - 如何启用BDS2006的C++ WARN & TRACE宏

c++ - 在 cv::imshow() 中出现错误 - 断言:文件 qasciikey.cpp 中的 "false",第 501 行