2016-12-30 34 views
5

Biorąc pod uwagę następujący kod C++ 'mini.cpp':gcc tworzy typ MIME application/x-sharedlib zamiast application/x-aplikacji

#include "iostream" 

using namespace std; 

int main() { 
    cout << "Hello World" << endl; 
    return 0; 
} 

a polecenie kompilator:

g++ -o hello mini.cpp 

się wynik

mimetype hello 

jest

hello: application/x-sharedlib 

Jak uzyskać "application/x-application" jako typ mime?

Używam gcc 6.2.0 na Kubuntu.

+0

Co jest 'mimetype'? – melpomene

+0

spróbuj 'file -i hello' – zaufi

+0

mimetype to tylko skrypt. Tło mojego pytania jest inne: nie mogę wykonać aplikacji o niewłaściwym typie MIME z eksploratora plików lub paska zadań. – Andreas

Odpowiedz

7

gcc nie ustawia typu MIME. mimetype odgaduje odpowiedni typ MIME na podstawie zawartości pliku. W przypadku plików ELF (większość skompilowanych plików binarnych i bibliotek współużytkowanych) the header zawiera pole e_type, które identyfikuje jego typ. Jeśli jest to ET_DYN, wówczas mimetype potraktuje go jako bibliotekę współdzieloną.

Domyślnie gcc/ld tworzy pliki binarne, które ustawiają e_type na ET_EXEC, które zostaną wykryte jako application/x-executable. Gdy zostanie użyta opcja wiersza polecenia -pie, tworzony jest niezależny od położenia plik wykonywalny, który może, podobnie jak biblioteki współdzielone, być ładowany pod różnymi adresami i nadal działać. Ponieważ działa to bardzo podobnie do biblioteki współdzielonej, aby uniknąć zbyt wielu zmian w programie ładującym, takie pliki binarne są oznaczane jako ET_DYN, nawet jeśli mogą być wykonywane bezpośrednio.

Niektóre dystrybucje systemu Linux, łącznie z użytkownikami, ustawiły domyślnie -pie. Nadal można to zmienić przy pomocy -no-pie, ale fakt, że typ MIME jest źle wykrywany, nie powinien być postrzegany jako błąd, a jeśli nie wiesz, co robisz, nie powinieneś go zastępować. -pie pozwala uzyskać dodatkowe zabezpieczenia, które są zasadniczo niezgodne z -no-pie.

+0

Dzięki za wyjaśnienie. Opracowałem aplikację z interfejsem opartym na Qt/C++. Użytkownicy oczekują, aby otworzyć go, klikając dwukrotnie w eksploratorze plików. Nie jest to możliwe, jeśli typ mime jest źle odgadnięty. Czy to jest powód "-nowy-pie"? A może są inne work-aroundy? – Andreas

+0

@Andreas znalazłeś pracę dookoła? Od momentu przejścia na Ubuntu 17.04 mam dokładnie ten sam problem ... –

+0

@BaptisteArnaud Mam takie samo doświadczenie z moim Qt/C++ skompilowanym 17.04. jakiekolwiek obejście? – shabang

0

go rozwiązać na Qt/C++ GUI aplikacji, należy dodać następującą linię do pliku .pro:

QMAKE_LFLAGS += -no-pie