I create a parser engine for Gold Parser, improving an existing one adding whole support for UTF-8 or UNICODE and error handling. And I want make it available also on Linux and therefore I want test it on Linux and at the same time improve my skills with this SO(Ubuntu 22) and learn Makefile.
In hurry for ask this question on Stack Overflow I uploaded all on github. The library is mparser
, main
contains the test functions and dhash
is my tool for the debug(just checks the memory leaks) I included dhash
so I have a more complicated scenario to learn Makefile.
What is the problem: It does not run on Linux. I copied the Makefile from this site Make tutorial, after I understood it closely 80% I did some changes to run with my project, it is available on GitHub but I post it also here:
IDIR =include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = dhash.h mparser.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
FDEPS =$(_DEPS)
_OBJ = mparser.o dhash.o main.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(FDEPS)
$(CC) -c -o $@ $< $(CFLAGS)
mparser: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
In Linux I added the current directory .
to the path as suggested here.
I run file mparser
and it says:
mparser: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=7b91119ab5e7a335c16c61c883ad5092da23eab5, for GNU/Linux 3.2.0, not stripped
So there is the magic word executable
as suggested here. But if I launch mparser
it says denied access. I tried also with whole path, /media/jurhas/INTENSO/mparser
, and doesn't work either.
How can I run my program on Linux after I compiled it?
Edit:
": Permission denied" when trying to execute something much always means about linux file permissions.
You are trying to "execute" a file on a Linux filesystem that does not have the executable flag.
Here is the simplest way to view if a file is executable:
user@host:~$ ls -lah file.txt
-rw-rw-r-- 1 myuser myusergroup 0 Jan 23 13:37 file.txt
You want to look at this: -rw-rw-r--
It states:
rw-rw-r--
is the default for most Linux distributions.
What you want to do is make your file executable. There are a number of ways for that.
# before
user@host:~$ ls -lha file.txt
-rw-rw-r-- 1 user user 0 Jan 23 13:37 file.txt
# give everyone executable permissions
user@host:~$ chmod +x file.txt
# after
user@host:~$ ls -lha file.txt
-rwxrwxr-x 1 user user 0 Jan 23 13:37 file.txt
Now EVERYONE can execute your file. This is most likely not what you want.
user@host:~$ ls -lha file.txt
-rw-rw-r-- 1 user user 0 Jan 23 13:41 file.txt
user@host:~$ chmod u+x file.txt
user@host:~$ ls -lha file.txt
-rwxrw-r-- 1 user user 0 Jan 23 13:41 file.txt
You can use u+x
as argument to chmod to give ONLY the user that owns the file execute permissions.
If this does not help try mount | grep noexec
. If your file is located in a filesystem that is mounted with noexec, you are unable to execute files in there. You can update your /etc/fstab
(the file that lists whats to be mounted on boot), remove the noexec and remount the directory using mount -o remount /path/to/mounted/dir