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.
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. –