Posts tagged ‘long’

I’ve been working on enum again recently and got completely stuck in getopt_long() return values. I don’t want to bore you with details, so let me cut to the chase: I needed a way to look into what getopt_long() is actually doing.

Now, there are a few ways to figure out the doings of a function. If it’s your own code, you could just go ahead and add a few printf()s to see if your variables fill up as intended. Then you could use gdb to walk through your running code. But what if you want to do so in functions outside the scope of your own code? In my case: getopt, i.e. libc?

Obviously, you can download the library, add your printf() stuff, compile and install it, and see it all happening. But libc isn’t exactly small, fast-compiling, and you really don’t want to mess it up and have it installed on your system. So how about just taking what you actually care for and push it in? This is nothing experimental or particularly “hacky”. I just don’t want to forget about it and maybe someone can make use of it. So here we go…

Download your libc sources to a new directory and copy the files you need. Try something like

mkdir -p /tmp/getopt/mygetopt
cd /tmp/getopt
apt-get source eglibc
cp eglibc-*/posix/getopt* mygetopt/
cd mygetopt

Now write up a primitive Makefile:

all: libmygetopt.so

libmygetopt.so: getopt.c getopt1.c getopt_int.h getopt.h
	gcc -shared -Wl,-soname,libmygetopt.so.1 -fPIC -o libmygetopt.so.1.0.0 getopt1.c getopt.c
	ln -s libmygetopt.so.1.0.0 libmygetopt.so.1
	ln -s libmygetopt.so.1 libmygetopt.so

clean:
	$(RM) libmygetopt*

In order for this to actually work, I fiddled around with a few #ifdef’s in getopt.c. But that’s something you’ll probably find out yourselves. You should at least be able to compile it (‘make’ it). Now put a printf statement somewhere in the function you want to inspect. Recompile the lib and then go back to your actual program.

Running the program ist easy.

src/enum -p1 1 3
1.0
2.0
3.0

Surprisingly, running it using your own getopt version is just as easy. Just push your library in:

LD_PRELOAD=libmygetopt.so LD_LIBRARY_PATH=/tmp/getopt/mygetopt:$LD_LIBRARY_PATH src/enum -p1 1 3
Yo, Ulrich, my getopt version is waaaay cooler than yours!
Yo, Ulrich, my getopt version is waaaay cooler than yours!
1.0
2.0
3.0

If you’re disappointed now, that’s your own fault. I said it in the beginning, this is nothing special. It’s not my idea. It’s something that developers all use all the time … or something like that. In case you didn’t know about it, good for you. Otherwise, sorry for reading my memory dump.

In einer Zeit, in der förmlich alles im Internet abgehandelt wird, in der die Sekunden schneller gehen als je zuvor, in der die Menschen keine Zeit mehr haben, auf ein persönliches Treffen zu warten oder kurz anzurufen; in einer Zeit, in der man nur schnell mal was fragen wollte, um dann schon zum nächsten Tagesordnungspunkt überzugehen; in einer solchen Zeit beschloss ich, eine Freundin nach der Telefonnummer von ihrem Frisör zu fragen, die ich von anderer Quelle nicht in Erfahrung bringen konnte, denn, wer mich kennt, weiß, dass ich das mal wieder nötig habe. Leider war meine Frage wohl zu lang, um über den Facebook-Chat zu wandern, also schrieb ich sie ihr in einer Facebook-Message. Dabei hab ich mich extra kurz gefasst:

Liebe Zeitgenossin, mir ist zuweilen vorgetragen worden, dass, und solches stelle man sich ersteinmal vor, obgleich doch es wenig überraschend ist, bedenkt man, um wen es sich handelt, du ganz im Gegensatz zu ihr im stolzen Besitze dessen bist, das mir zueigen gemacht sich gar lohnen würde, wenn auch der Ausgang des angestrebten Unterfangens noch umnachtet, will sagen: in greifbarer und dennoch unklarer Ferne zu liegen scheint. Aus diesem Grunde nun würde ich meine Verbundenheit zu deiner Person außerdordentlich zum Ausdruck bringen wollen, wenn nun du, so deine bezaubernde Güte es zulässt, mir unter die Arme greiftest, um mir zu geben, was sie mir nicht geben konnte angesichts ihrer erstaunlichen Besitzlosigkeit. Was dieses etwas, dessen ich mich ermächtigen will, nun ist, wird deinen Geiste wohl beschäftigen, und es liegt mir fern, mich der Werkzeuge verbaler Folter zu bedienen, um zu spannen, was zu spannen sich nun nicht mehr gehört. Es liegt mir nämlich zweierlei am Herzen: zum einen, deine unermässliche Güte und Zuneigung nicht zu strapazieren, zum anderen, mein Anliegen einer Endgültigkeit näher zu bringen. Daher möchte ich darum bitten, holde Maid, dass du mir an ihrer Stelle die Ehre erweisest und mir mitteiltest, wie die Nummer derjenigen, die deiner Kopfbedeckung ständig so zuträglich ist, lautet, sodass ich mit ihr eine Unterredung und mögliche Behandlung meines dir bekanntes Dilemmas vereinbaren kann. Ich hoffe, selbiges liegt so weit auch in deinem Interesse, dass du mir diesen Gefallen nicht abschlägst und mich so zu einem glücklichen Freund an deiner Seite machst, der, wie angedeutet, tief in deiner Schuld stünde.