A complete newbie here. I am learning to read the codes on suckless.org. They are written in C, and are most quite short, so I think it's a good start.
The problem is I know too little to start with. Wandering around on the site, I found that the suckless community has their own coreutils, which are also very short. echo.c
on this page is one of the shortests. I include its header here:
/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <string.h>
#include "util.h"
I'd like to compile it and see how this version of echo
works, and come back to understand the code. The goal is to repeat this process until I'm comfortable enough to read the source codes of their their larger programs like sent
, dmenu
, dwm
.
In the code, the header #include "util.h"
suggests me to put util.h
, which is another file in the link above, together with echo.c
. I also include arg.h
and compat.h
because the header of util.h
says
#include <sys/types.h>
#include <regex.h>
#include <stddef.h>
#include <stdio.h>
#include "arg.h"
#include "compat.h"
I further checked arg.h
and compat.h
. Neither of them includes customized header files, so I think I'm good to go. Now the folder tree looks like
$ tree
.
├── arg.h
├── compat.h
├── echo.c
└── util.h
and I run $ gcc echo.c -o echo.o
. However, I got an error
/usr/bin/ld: /tmp/cc2VjXNO.o: in function `main':
echo.c:(.text+0x20): undefined reference to `argv0'
/usr/bin/ld: echo.c:(.text+0x27): undefined reference to `argv0'
/usr/bin/ld: echo.c:(.text+0x8d): undefined reference to `putword'
/usr/bin/ld: echo.c:(.text+0xc8): undefined reference to `fshut'
collect2: error: ld returned 1 exit status
Apparently, these undefined arguments are in those header files. Searching around on the net, I further tried
$ gcc -c . echo.c -o echo.o
gcc: warning: .: linker input file unused because linking not done
It spits a warning, but anyway an echo.o
is delivered. I chmod
it to executable, and run it by $ ./echo.o
, but my shell complains
zsh: exec format error: ./echo.o
I spent another hour trying to solve this.. by try and error, but in vain. Would you please point out what's going on? And what should I do?
(Any other suggestions will also be very appreciated.)