Re: merkwuerdiges Resultat in errno

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Fri, 28 Dec 2007 18:31:11 +0100 (CET)

Marc Santhoff wrote:
> 1. Hab' ich schon versucht, leider funktioniert's dann normal.
>
> 2. Nützt nicht viel, ich benutze fpc (www.freepascal.org) und
> Objekt-Pascal.

Hättest Du gleich sagen sollen; dann hätte ich's gar nicht
erst probiert. In dem Fall ist ziemlich klar, dass fpc
dort irgendwo Murks fabriziert.

Verwendet fpc die normale libc, oder hat er sein eigenes
Syscall-Interface? Wenn letzteres, dann ist darin mit
Sicherheit der Bug verbogen. Die Übergabe der Rückgabe-
werte und des Fehlercodes vom Kernel zum Userland ist
nämlich durchaus knifflig und ein wenig »von hinten durch
die Brust ins Auge«.

Der Kernel setzt nämlich nicht etwa errno, sondern gibt
den Fehlerwert als Funktionsrückgabe per return zurück
und setzt ggf. das Carry-Flag. Das Ergebnis des Calls
(z.B. die Dateiposition bei lseek(2)) wird im struct proc
abgelegt.

Der Syscall-Interface-Code in der libc prüft dann, ob
das Carry-Flag gesetzt ist, und packt in dem Fall den
Rückgabewert in errno und liefert seinerseits -1 als
Rückgabewert. Anderenfalls (d.h. Carry-Flag gelöscht)
wird der Rückgabewert aus dem struct proc gefischt.

Wer's sich angucken mag, kann sich mal sys/cerror.S und
SYS.h in src/lib/libc/i386 ansehen. Assemblerkenntnisse
sind hilfreich.

Wenn fpc nicht die libc verwendet, sondern das selber
machen will, dann kann schon ein kleiner Fehler (an
irgendeiner Stelle %ax statt %eax) zu dem beschriebenen
Symptom führen.

Gruß
   Olli

PS: Ebenfalls einen guten Rutsch!

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart
FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd
"One of the main causes of the fall of the Roman Empire was that,
lacking zero, they had no way to indicate successful termination
of their C programs."
        -- Robert Firth
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 28 Dec 2007 - 18:31:12 CET

search this site