GithubHelp home page GithubHelp logo

isabella232 / linux-syscall-support Goto Github PK

View Code? Open in Web Editor NEW

This project forked from getsentry/linux-syscall-support

0.0 0.0 0.0 152 KB

Mirror of https://chromium.googlesource.com/linux-syscall-support

C 97.67% Makefile 2.33%

linux-syscall-support's Introduction

Linux Syscall Support (LSS)

Every so often, projects need to directly embed Linux system calls instead of calling the implementations in the system runtime library.

This project provides a header file that can be included into your application whenever you need to make direct system calls.

The goal is to provide an API that generally mirrors the standard C library while still making direct syscalls. We try to hide some of the differences between arches when reasonably feasible. e.g. Newer architectures no longer provide an open syscall, but do provide openat. We will still expose a sys_open helper by default that calls into openat instead.

We explicitly do not expose the raw syscall ABI including all of its historical warts to the user. We want people to be able to easily make a syscall, not have to worry that on some arches size args are swapped or they are shifted.

Please be sure to review the Caveats section below however.

How to include linux_syscall_support.h in your project

You can either copy the file into your project, or preferably, you can set up Git submodules to automatically pull from our source repository.

Supported targets

The following architectures/ABIs have been tested (at some point) and should generally work. If you don't see your combo listed here, please double check the header itself as this list might be out of date.

  • x86 32-bit (i.e. i386, i486, i586, i686, Intel, AMD, etc...)
  • x86_64 64-bit (i.e. x86-64, amd64, etc...)
  • x32 32-bit
  • ARM 32-bit OABI
  • ARM 32-bit EABI (i.e. armv6, armv7, etc...)
  • AARCH64 64-bit (i.e. arm64, armv8, etc...)
  • PowerPC 32-bit (i.e. ppc, ppc32, etc...)
  • MIPS 32-bit o32 ABI
  • MIPS 32-bit n32 ABI
  • MIPS 64-bit n64 ABI

API

By default, you can just add a sys_ prefix to any function you want to call. So if you want to call open(...), use sys_open(...) instead.

Knobs

The linux_syscall_support.h header provides many knobs for you to control the exported API. These are all documented in the top of the header in a big comment block, so refer to that instead.

Caveats

ABI differences

Some functions that the standard C library exposes use a different ABI than what the Linux kernel uses. Care must be taken when making syscalls directly that you use the right structure and flags. e.g. Most C libraries define a struct stat (commonly in sys/stat.h or bits/stat.h) that is different from the struct stat the kernel uses (commonly in asm/stat.h). If you use the wrong structure layout, then you can see errors like memory corruption or weird/shifted values. If you plan on making syscalls directly, you should focus on headers that are available under the linux/ and asm/ namespaces.

Note: LSS provides structs for most of these cases. For sys_stat(), it provides struct kernel_stat for you to use.

Transparent backwards compatibility with older kernels

While some C libraries (notably, glibc) take care to fallback to older syscalls when running on older kernels, there is no such support in LSS. If you plan on trying to run on older kernels, you will need to handle errors yourself (e.g. ENOSYS when using a too new syscall).

Remember that this can happen with new flag bits too. e.g. The O_CLOEXEC flag was added to many syscalls, but if you try to run use it on older kernels, it will fail with EINVAL. In that case, you must handle the fallback logic yourself.

Variable arguments (varargs)

We do not support vararg type functions. e.g. While the standard open() function can accept 2 or 3 arguments (with the mode field being optional), the sys_open() function always requires 3 arguments.

Bug reports & feature requests

If you wish to report a problem or request a feature, please file them in our bug tracker.

Please do not post patches to the tracker. Instead, see below for how to send patches to us directly.

While we welcome feature requests, please keep in mind that it is unlikely that anyone will find time to implement them for you. Sending patches is strongly preferred and will often move things much faster.

Projects that use LSS

How to get an LSS change committed

Review

You get your change reviewed, you can upload it to Gerrit using git cl upload from Chromium's depot-tools.

Testing

Tests are found in the tests/ subdirectory. It does not (yet) offer 100% coverage, but should grow over time.

New commits that update/change/add syscall wrappers should include tests for them too. Consult the test documentation for more details.

To run, just run make inside the tests directory. It will compile & execute the tests locally.

There is some limited cross-compile coverage available if you run make cross. It only compiles things (does not execute at all).

Rolling into Chromium

If you commit a change to LSS, please also commit a Chromium change to update lss_revision in Chromium's DEPS file.

This ensures that the LSS change gets tested, so that people who commit later LSS changes don't run into problems with updating lss_revision.

linux-syscall-support's People

Contributors

aarongable avatar bryanpkc avatar drlk avatar kraj avatar michaelforney avatar nico avatar petar-jovanovic avatar sdats avatar shishkander avatar tornewuff avatar vapier avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.