2012-08-13 10 views
6

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

6

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

5

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.

+0

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

+0

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

+2

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

1

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

+0

Nie, to nie działa. – Probie

+0

W jaki sposób to "nie działa"? –

+0

@Probie: Rozumiem, co masz na myśli; sprawdza tylko zgodność, ale może uzupełniać sugestię T.E.D. (http://stackoverflow.com/a/11936532/230513). – trashgod

3

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.