{"id":25258,"date":"2026-10-15T14:29:23","date_gmt":"2026-10-15T12:29:23","guid":{"rendered":"https:\/\/linux-bibel.at\/?p=25258"},"modified":"2026-10-15T14:31:45","modified_gmt":"2026-10-15T12:31:45","slug":"ltrace-oder-was-macht-ein-programm","status":"publish","type":"post","link":"https:\/\/linux-bibel.at\/index.php\/2026\/10\/15\/ltrace-oder-was-macht-ein-programm\/","title":{"rendered":"ltrace &#8230; oder was macht ein Programm"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Mit strace haben wir uns die Schnittstelle zum Kern angeschaut und die syscall-Aufrufe protokolliert. Nun, das ist die eine H\u00e4lfte eines Programmes. Der andere Teil sind die Aufrufe von Funktionen.  <br><br>F\u00fcr jene, die noch nicht so sattelfest im Programmieren sind, denen sei in Stammbuch geschrieben. Programmierer sind faule Leute (es gibt aber noch andere Gr\u00fcnde ,-), und wenn man etwas mehrfach braucht, dann macht man eine Funktion daraus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Beispiel:  getipnodebyaddr und getipnodebyname <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir nehmen die C-Funktionen getipnodebyaddr und getipnodebyname als Beispiel. Beim Aufruf geben wir eine IP-Adresse mit und bekommen den Namen zur\u00fcck. bzw geben wir den Namen an und bekommen die IP-Adresse. Woher der kommt wissen wir nicht. DNS-Server w\u00e4ren eine Option, \/etc\/hosts eine andere. Wir fragen nach der &#8222;www.linux-bibel.at&#8220; und bekommen &#8222;5.132.191.10&#8220; zur\u00fcck. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Funktion(en) kann man jetzt im Mail-Programm und im Browser-Programm verwenden. Daher lagert man, die Routinen in eigene lib<em>rary<\/em>-Dateien aus und bindet die Lib<em>rary<\/em> in beide Programme ein. Diese lib<em>rary<\/em>s erkennt man an der Namenskonversation .so bzw .a und sind  oft unter \/usr\/lib gesammelt. Unter Windows ist dieses Prinzip unter dem K\u00fcrzel DLL bekannt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es gibt jetzt ein Programm namens ltrace. ltrace zeigt an, welche dieser Funktionen verwendet werden. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ltrace ls <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und man bekommt diese Ausgabe&#8230;&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>strrchr(&#8222;ls&#8220;, &#8218;\/&#8216;) = nil<br>setlocale(LC_ALL, &#8222;&#8220;) = &#8222;de_AT.UTF-8&#8220;<br>bindtextdomain(&#8222;coreutils&#8220;, &#8222;\/usr\/share\/locale&#8220;) = &#8222;\/usr\/share\/locale&#8220;<br>textdomain(&#8222;coreutils&#8220;) = &#8222;coreutils&#8220;<br>__cxa_atexit(0x562858ba2e00, 0, 0x562858bba008, 0) = 0<br>getopt_long(1, 0x7ffd9d019388, &#8222;abcdfghiklmnopqrstuvw:xABCDFGHI:&#8220;&#8230;, 0x562858bb9340, -1) = -1<br>getenv(&#8222;LS_BLOCK_SIZE&#8220;) = nil<br>getenv(&#8222;BLOCK_SIZE&#8220;) = nil<br>getenv(&#8222;BLOCKSIZE&#8220;) = nil<br>getenv(&#8222;POSIXLY_CORRECT&#8220;) = nil<br>getenv(&#8222;BLOCK_SIZE&#8220;) = nil<br>isatty(1) = 1<br>ioctl(1, 21523, 0x7ffd9d019220) = 0<br>getenv(&#8222;TABSIZE&#8220;) = nil<br>getenv(&#8222;QUOTING_STYLE&#8220;) = nil<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mit dem Kommando man &lt;Funktion&gt; bekommen wir eine \u00dcbersicht, was diese Funktion ausf\u00fchrt soll(te). Ansonsten ist der Funktionsumfang \u00e4hnlich dem Programm strace nur das es Lib-Aufrufe protokolliert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ja es k\u00f6nnte sein, dass sie das Programm installieren m\u00fcssen. Dann gilt<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install ltrace<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und jetzt der nicht so sch\u00f6ne Harken an der Sache. Die Standard-Linux-Librarys sind alle wohl dokumentiert. Ich kann aber auch eigene Libs schreiben. Die Dokumentation muss ich nicht als man-page offen legen. Genau so wenig wie eine Firma ihren Source-Code ver\u00f6ffentlichen muss. Und damit beginnt das Problem. Projekt A benutzt &#8222;getipnodebyname&#8220; ein anderes Projekt benutzt eine andere Funktion die das gleiche machen k\u00f6nnte. Ich kann auch eine Funktion so kapseln, dass ich sie f\u00fcr andere Sprachen zur Verf\u00fcgung stelle (z.B. Python, Java ). Wenn man ein Wayland-Programm \u00fcber ltrace aufruft findet man jede Menge Funktionen, die u.U. nicht so einfach zu finden sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vorteil an der Sache ist, dass Programmieren faule Leute sind und Dokumentationen nicht lieben. Bevor ich eine Funktion &#8222;xy123&#8220;  \u00fcberlege ich mir einen sprechenden Namen wie get_ip_node_by_name und damit ist der Name schon Dokumentation. \ud83d\ude09 <br>Und wenn ich jetzt noch das _ Zeichen weg lasse&#8230;..  \ud83d\ude00<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zur\u00fcck den Funktionen. Ich kann jetzt 3 Arten von Funktionen schreiben. <\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In meinem Sourcecode direkt. Dann sind sie auch nur f\u00fcr mein eigenes Programm aufrufbar. <br>Verwendet f\u00fcr spezielle Berechnungen oder Abl\u00e4ufe die f\u00fcr das eine Programm spezialisiert sind. <\/li>\n\n\n\n<li>Die statisch gelinkten .a Files<br>Diese werden zu meinen Source-Code &#8222;dazukopiert&#8220; und sind Bestandteil des Programmes. Ein Bespiel sind die &#8222;Notlauf-Programme&#8220; beim boot, wie fsck. Dieses muss alle Funktionen inkludieren, auch wenn das root-Filesystem nicht zur Verf\u00fcgung steht. Bei \u00c4nderungen muss alles mindestens neu gelinkt werden. Die Programmgr\u00f6\u00dfe steigt beim statischen Linken. <\/li>\n\n\n\n<li>Die shared-Library ist die 3. und letzte Art der Aufbewahrung. Vereinfacht dargestellt, wird die Library (.so Datei) einmal in den Speicher geladen und jedes Programm bekommt eine Kopie der Funktionen zur Laufzeit die es ben\u00f6tigt. <br>Vorteil dabei ist, dass bei Updates diese im laufenden Betrieb durchgef\u00fchrt werden k\u00f6nnen. Sobald die Funktion geladen wird ist die Neue verf\u00fcgbar.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr Anwenderprogramme werden Shared-Liberay haupts\u00e4chlich verwendet. Diese sind leicht auszutauschen und somit leicht und flexibel. Von der Laufzeit kann man Unterschiede messen, im praktischen Betrieb sind diese allerdings minimalst<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ltrace zeigt uns alle &#8222;externen&#8220; dazu gelinkten Arten an.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Zusammenhang sind 2 weitere Programme sehr n\u00fctzlich. <\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Das programm &#8222;type&#8220;<br>type zweigt an, wo im Filesystem sich das Programm befindet. Und ggf den Type des Programmes.<br>ein <br><br><em>type ls <\/em><br><br>liefert die Ausgabe <br><br><em>ls ist \/usr\/bin\/ls<\/em><br><\/li>\n\n\n\n<li>ldd ist das zweite Programm.<br>Das Programm ldd liefert alle Shared-<strong>Library<\/strong>, die verwendet werden. ldd muss allerdings mit dem vollen Path angegeben werden. Wo das Programm zu Hause ist, haben wir gerade in Punkt 1 festgestellt. \ud83d\ude09<br><br><em>ldd \/usr\/bin\/ls<\/em><br><br>Du bekommst jetzt folgende \u00dcbersicht:<br><br><code>linux-vdso.so.1 (0x00007fd173302000) <\/code><br><code>libselinux.so.1 =&gt; \/lib\/x86_64-linux-gnu\/libselinux.so.1 (0x00007fd17327e000) <\/code><br><code>libcap.so.2 =&gt; \/lib\/x86_64-linux-gnu\/libcap.so.2 (0x00007fd173272000) <\/code><br><code>libc.so.6 =&gt; \/lib\/x86_64-linux-gnu\/libc.so.6 (0x00007fd17307e000) <\/code><br><code>libpcre2-8.so.0 =&gt; \/lib\/x86_64-linux-gnu\/libpcre2-8.so.0 (0x00007fd172fcf000) <\/code><br><code>\/lib64\/ld-linux-x86-64.so.2 (0x00007fd173304000)<\/code><br><br><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><br> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese <strong>Library<\/strong> werden von ls benutzt, das wissen wir jetzt. Welche Funktionen inkludiert jetzt eine solche  Library? Das ist gar nicht so einfach herauszufinden. Am einfachsten funktioniert es mit dem Kommando &#8222;objdump -T &lt;path\/library&gt;&#8220;  <br>Allerdings k\u00f6nnen sich auch weiterer Code in solchen Lib befinden. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anhand der Returncodes k\u00f6nnen wir eine Ahnung bekommen, wo der Fehler liegen k\u00f6nnte. Es sei nicht verschwiegen, dass es weitere M\u00f6glichkeiten gibt tiefer in den Code einzudringen. Aber das wird vielleicht ein weiterer Artikel. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich k\u00f6nnte mir vorstellen, dass die beiden Programme strace und ltrace euch helfen k\u00f6nnten, Probleme etwas einfacher aufzudecken.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Viel Spass dabei.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit strace haben wir uns die Schnittstelle zum Kern angeschaut und die syscall-Aufrufe protokolliert. Nun, das ist die eine H\u00e4lfte eines Programmes. Der andere Teil sind die Aufrufe von Funktionen. F\u00fcr jene, die noch nicht so sattelfest im Programmieren sind, denen sei in Stammbuch geschrieben. Programmierer sind faule Leute (es gibt aber noch andere Gr\u00fcnde [&hellip;]<\/p>\n","protected":false},"author":52,"featured_media":25259,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[12,5,6],"class_list":["post-25258","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","tag-kommandozeile","tag-linux","tag-terminal"],"_links":{"self":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/25258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/comments?post=25258"}],"version-history":[{"count":10,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/25258\/revisions"}],"predecessor-version":[{"id":25300,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/25258\/revisions\/25300"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media\/25259"}],"wp:attachment":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media?parent=25258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/categories?post=25258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/tags?post=25258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}