Napisałem kilka modułów jądra w Ada, i trafiłem na mały problem. Licencja jest zdefiniowana jako makro c, i nie mogę stwierdzić, co to jest. Czy jest to odpowiednie rozwiązanie, aby po prostu dokonać reeksportu wszystkich funkcji c, które wymagają GPL, jeśli zarówno moduł c, jak i ada mają licencje zgodne z GPL? Czy jest lepszy sposób to zrobić?Ustawianie licencji na moduły w jądrze Linuxa
Odpowiedz
Radzenie sobie z makrami C to królewska PITA. Mam marzenie, że pewnego dnia programiści C zrobią resztę świata przysługę i przestaną z nich korzystać.
Gdybym to ja, uruchomiłbym makro, aby zobaczyć, co wyprowadza, a następnie napisz jakiś kod Ada, aby wyprowadzić odpowiednik.
Po przeczytaniu odpowiedzi Rolanda, wygląda na to, że może być wymagana definicja implementacji pragma linker_section.
pragmy Linker_Section ([Jednostka =>] LOCAL_NAME [Sekcja =>] static_string_EXPRESSION);
LOCAL_NAME musi odwoływać się do obiektu zadeklarowanego na poziomie biblioteki . Ta zasada określa nazwę sekcji linkera dla podanej jednostki. Jest to odpowiednik
__attribute__((section))
w GNU C i powoduje, że LOCAL_NAME zostanie umieszczony w sekcji static_string_EXPRESSION pliku wykonywalnego (zakładając, że linker nie zmieni nazwy sekcji ).
Nie jestem pewien, czy to pytanie jest żartem, czy nie, ale jeśli poważnie myślisz o pisaniu modułów jądra w Ada, to nie mogę sobie wyobrazić, że ustawienie licencji na moduł jest dużą przeszkodą w porównaniu do wszystkiego inaczej musiałeś trafić.
W każdym przypadku licencja na moduł jest po prostu ciągiem takim jak "license = GPL" w sekcji .modinfo pliku .ko. W kodzie C jest on tworzony przez makro __MODULE_INFO()
z <linux/moduleparam.h>
, które po prostu tworzy tablicę z char
, która jest ustawiona na łańcuch jak wyżej, oznaczony __attribute__((section(".modinfo")))
.
Przypuszczam, że prawdopodobnie istnieje jakiś analogiczny sposób na zrobienie tego w Adzie; jeśli nie, w najgorszym przypadku powinno to być możliwe za pomocą skryptu linkera. Prawdopodobnie masz już i tak jakiś sposób, aby ustawić część "vermagic = XXX" sekcji .modinfo.
Ponieważ prawdopodobnie używasz GNAT, możesz być w stanie użyć pragma License ", aby umożliwić automatyczne sprawdzanie odpowiednich warunków licencji w odniesieniu do standardowej i zmodyfikowanej GPL."
Jako podejście do ominięcia tego problemu, można zostawić część licencyjną w C i używać Annex B (relacje z innymi językami) funkcje do niego dostęp?
Powinno to zawierać problem co najmniej i pozwolić ci przejść do innych modułów.
W najlepszym razie możesz sprawdzić w Adzie, jak wygląda licencja i dokonać inżynierii wstecznej w ten sposób.
- 1. Jak mogę przydzielić pamięć w jądrze Linuxa na ciąg znaków typu char *?
- 2. Wdrażanie biblioteki sprawdzania licencji
- 3. Typy licencji na oprogramowanie rozwojowe
- 4. hrtimer powtarzające się zadanie w jądrze Linuksa
- 5. Modele licencji
- 6. Jądro Linuxa Unieważniające wpisy TLB
- 7. Adres w jądrze
- 8. Transmisja na żywo HTTP: Koszmar Linuxa
- 9. Definicje segmentów dla Linuxa na x86
- 10. Wybór Linuxa IPC?
- 11. Przegląd wolnych licencji na oprogramowanie (dla manekinów)
- 12. Narzędzie do określania licencji na zależności pom.xml
- 13. Wywołanie funkcji w jądrze Linuksa
- 14. Niestandardowe typy w jądrze OpenCL
- 15. Usterka potrójna w rodzimym jądrze
- 16. Szukasz wdrożenie systemu wywołuje na jądrze Linux
- 17. Jak spać w jądrze Linuksa?
- 18. Równoważnik usleep() w jądrze CUDA?
- 19. W jaki sposób pthread jest implementowany w jądrze Linux 3.2?
- 20. Jak udostępnić funkcję jądra Linuxa do ftrace function_graph tracer?
- 21. Initramfs wbudowany w niestandardowe jądro Linuxa nie działa
- 22. Ruby: moduły rozszerzające/zawierające moduły
- 23. Kompilowanie jądra Linuxa Błąd xt_CONNMARK.h
- 24. Wskazówki dotyczące nauki wbudowanego linuxa
- 25. Korzystanie z licencji Open Source
- 26. Obsługa licencji TPL i wyjątków
- 27. Mierzenie czasu w jądrze Linuksa 2.6
- 28. Implementacja sygnałów zegarowych sprzętowych w jądrze Linux
- 29. Ustawianie DataContext na DataGrid.RowStyle
- 30. Słuchanie nowych procesów w jądrze Linux Module
Dlaczego pytanie byłoby żartem? Byłem także gotowy na każdą inną przeszkodę, którą uderzyłem; Szczerze mówiąc, nie spodziewałem się, że to będzie prawdziwy problem. – Probie
ponieważ 1) to naprawdę dużo łatwiej, jeśli po prostu napisasz swój moduł w C i 2) to trochę zaskakujące, że udało ci się rozwiązać wszystko inne, na pewno trafiłeś, a potem utknąłeś po niezupełnie złożonym rozszerzenie makra MODULE_LICENSE(). – Roland
Nie ma dobrego powodu (poza politycznymi), dlaczego nie można napisać modułu jądra w Adzie. Zgodzę się, że na początku wydaje się to zaskakujące, że coś tak pozornego jak makra C byłoby największą przeszkodą dla interoperacyjności, ale widziałem, że stało się to wielokrotnie. Makra są złe. –