Articles of rouille

Le pointeur brut devient nul, passant de Rust à C

J’essaie de récupérer un pointeur brut d’une fonction C en rouille et d’utiliser ce même pointeur brut comme argument dans une autre fonction C d’une autre bibliothèque. Lorsque je passe le pointeur brut, je me retrouve avec un pointeur NULL du côté C. J’ai essayé de faire une version simplifiée de mon problème, mais quand […]

Allocation d’un object pour les appels de bibliothèque C / FFI

J’ai une bibliothèque C, qui a l’implémentation de gpio. Il y a gpio_type qui est spécifique à la cible, chaque MCU a une définition différente pour gpio_type. Une des fonctions de la bibliothèque: void gpio_init(gpio_type *object, int32_t pin); Je veux écrire une abstraction de l’object Gpio dans Rust, en utilisant les fonctions de la bibliothèque […]

Comment convertir une chaîne C en chaîne Rust et inversement via FFI?

J’essaie d’obtenir une chaîne C renvoyée par une bibliothèque C et de la convertir en chaîne Rust via FFI. mylib.c const char* hello(){ return “Hello World!”; } main.rs #![feature(link_args)] extern crate libc; use libc::c_char; #[link_args = “-L . -I . -lmylib”] extern { fn hello() -> *c_char; } fn main() { //how do I get […]

Est-il possible de générer et d’exécuter du code Rust au moment de l’exécution?

En utilisant C, au moment de l’exécution, je peux: Créer le code source d’une fonction, Appelez gcc pour le comstackr en .so (Linux) (ou utilisez llvm, etc.), Chargez le .so, et Appelle la fonction. Est-ce qu’une chose semblable est possible à Rust? En particulier, je souhaite utiliser des types de données algébriques. L’utilisation d’un sous-ensemble […]

Initialisation de sigset_t dans Rust

J’essaie d’en apprendre davantage sur le FFI dans Rust et sur la liaison avec les bibliothèques C (en particulier libc ). Au cours de ma “quête”, je suis tombé sur le problème suivant. Modèle normal en C void(* sig_set(int sig, void(*handler)(int))) { // uninitialized sigaction structs struct sigaction new_action, old_action; // assign options to new […]

Comment vérifier si le pointeur de fonction passé de C est non-NULL

Exemple de code ci-dessous La rouille: #[no_mangle] pub extern fn call_c_function(value: i32, fun: fn(i32) -> i32) -> i32 { fun(value) } Et la partie C: int32_t call_c_function(int32_t value, int32_t (*fun)(int32_t)); int32_t sortingple(int32_t x) { return x*3; } int main(int argc, char *argv[]) { int32_t value = 3; int32_t result = call_c_function(value, sortingple); printf(“%d sortingpled is […]

Créer un object C partagé lié à Rust dylib à utiliser dans R

J’essaie de créer un object partagé que je peux charger dans R qui appelle les fonctions Rust par le biais de l’API C de R. Pour appeler Rust de C, je suis cet article de blog . Mon problème se pose lorsque j’essaie de créer la bibliothèque partagée et de créer un lien vers la […]

Créer une interface avec les pointeurs de fonction C dans Rust

Je n’ai peut-être pas décrit correctement le titre de ma question, modifiez-le si nécessaire. J’essaie de créer une interface Rust dans la bibliothèque LXC , qui est écrite en C. J’ai réussi à appeler des fonctions simples comme lxc_get_version ou lxc_container_new mais je ne peux pas accéder aux fonctions décrites dans le bloc struct lxc_container […]

Création d’une structure C statique contenant des chaînes

J’essaie de créer une bibliothèque dynamic dans Rust qui exporte une structure sous forme de symbole qui sera chargé dans un programme C via dlopen (). Cependant, je rencontrais des erreurs de segmentation lors de l’access à la deuxième chaîne de la structure. J’ai donc créé un petit programme de test pour essayer de comprendre […]

Convertit les définitions simples de C # en constantes de rouille

J’ai une bibliothèque propriétaire avec une longue histoire et un en-tête 30KLoC. Je voudrais générer des liaisons pour Rust à elle. Et j’ai utilisé bindgen caisse presque avec succès. Sauf que bindgen ne peut pas transformer les constantes de macro en constantes normales. Parce que ces constantes sont définies de manière floue, comme #define CONSTANT […]