Since Ubuntu 16.10, the system GNU C compiler is configured with the --enable-default-pie
option. Thus, GCC by default builds packages with -fPIE
and -pie
enabled, which causes executable files’ mime types to be application/x-sharedlib
rather than application/x-executable
.
It’s OK for users to launch apps either from start menu (Activities overview) since they are controlled by the ‘.desktop’ files, or using command in terminal. But, if double-clicking executable file in file manager, it may refuse to run!
For example, the mime type of Avidemux executable file in my Ubuntu 20.04 is a “shared library” like .so
files. By double-clicking the file will NOT launch the app, though “Allow executing file as program” has been enabled.
Workaround:
The best choice is using -fno-pie
and -no-pie
options while compiling with GCC. So, the executable file will be set to application/x-executable
.
As a workaround, here’s how to make your file manager treat those files built with -pie
option as application/x-executable
.
1.) Firstly, press Ctrl+Alt+T on keyboard to open terminal. When it opens, run command to edit the “/usr/share/mime/packages/freedesktop.org.xml” file as root:
sudo gedit /usr/share/mime/packages/freedesktop.org.xml
For non-Gnome desktop, replacegedit
with your favorite text editor. For Ubuntu 22.10+, usegnome-text-editor
instead
2.) When file opens in editor, find out the section below (In my Ubuntu 20.04, it starts at line 10472):
<mime-type type="application/x-executable"> <comment>executable</comment> <comment xml:lang="af">uitvoerbaar</comment> ... many more comment lines ... <comment xml:lang="zh-TW">可執行檔</comment> <generic-icon name="application-x-executable"/> <magic priority="40"> <match type="string" value="\177ELF" offset="0"> <match type="byte" value="1" offset="5"> <match type="little16" value="2" offset="16"/> </match> </match> ... </mime-type>
Then, add following lines between <generic-icon name=”application-x-executable”/> and <magic priority=”40″>
<magic priority="60"> <match type="string" value="\177ELF" offset="0"><match type="byte" value="1" offset="4"><match type="byte" value="1" offset="5"><match type="little16" value="3" offset="16"><match type="little32" value="52" offset="28"><match type="little32" value="3" offset="84"/></match></match></match></match></match> <match type="string" value="\177ELF" offset="0"><match type="byte" value="2" offset="4"><match type="byte" value="1" offset="5"><match type="little16" value="3" offset="16"><match type="little32" value="64" offset="32"><match type="little32" value="0" offset="36"><match type="little32" value="3" offset="120"/></match></match></match></match></match></match> </magic>
3.) Finally, run command to update mime datebase:
sudo update-mime-database /usr/share/mime
Now, re-check the executable in file manager. It should be application/x-executable
now and double-click on file will launch the program.
via: this thread
.