Ik heb op een FreeBSD-machine een triviaal programmaatje geschreven geknipt en geplakt. Het programmaatje is geassembleerd met NASM en gelinkt met ld. Het draait prima op FreeBSD. Als ik dit programma overhevel naar mijn NetBSD-2.0-machine, werkt het ook voortreffelijk. Echter, als ik het object-bestand op mijn NetBSD-2.0 machine link, kan ik het niet draaien. Het besturingssysteem core dumpt het onmiddelijk. Vreemd genoeg werken beide versies van het programma wel goed op NetBSD-1.6.2.
Als ik het programma onder de loep neem, blijkt dat slechts een byte verschillend is tussen de versie die op FreeBSD is gelinkt en de versie die op NetBSD-2.0 is gelinkt. De eerste van de opvulbytes in de ELF-header is bij de FreeBSD-versie namelijk 09 en in de NetBSD-versie 00. Als de in de NetBSD-2.0 versie deze 00 met een hex-editor verander in 09, dan draait het weer. Dit is vreemd, omdat de ELF-specificatie vermeldt dat alle opvulbytes moeten worden genegeerd. Als ik trouwens de NetBSD-2.0-versie met 00 op FreeBSD probeer te draaien, gebeurt er dit:

Vraag rest: wat is hier aan de hand? Waarom maakt die ene byte in het opvulgedeelte zo veel uit? Is het een bug in NetBSD-2.0 vanwege de 00 in de opvulbyte reeks? Nee, want alle andere binaries hebben ook 00 als eerste byte in de opvulreeks in de ELF-header. Een bug in de linker? Zeer onwaarschijnlijk. Zoiets valt natuurlijk meteen op bij het builden van het systeem. Bovendien doet het probleem zich ook voor met andere versies (ook die van CVS) van ld. Is mijn programma dan foutief? En zo ja, waarom werkt het dan wel in FreeBSD en NetBSD-1.6.2. Als iemand mij het kan vertellen: GRAAG
Nog wat binaries ter onderwerping aan naar ik hoop het alziend oog van mijn mede-tweakers:
Als ik het programma onder de loep neem, blijkt dat slechts een byte verschillend is tussen de versie die op FreeBSD is gelinkt en de versie die op NetBSD-2.0 is gelinkt. De eerste van de opvulbytes in de ELF-header is bij de FreeBSD-versie namelijk 09 en in de NetBSD-versie 00. Als de in de NetBSD-2.0 versie deze 00 met een hex-editor verander in 09, dan draait het weer. Dit is vreemd, omdat de ELF-specificatie vermeldt dat alle opvulbytes moeten worden genegeerd. Als ik trouwens de NetBSD-2.0-versie met 00 op FreeBSD probeer te draaien, gebeurt er dit:
code:
1
| FreeBSD % ./hello |
De ELF-specificatie zegt ook dat alle opvulbytes in de ELF-header op 0 moeten staan. Dit klopt ook met andere binaries die ik op het NetBSD-2.0 systeem heb. Op het FreeBSD-systeem heb ik steekproefsgewijs ondervonden dat de eerste opvulbyte in binaries altijd op 09 staan. Weliswaar niet conform specs, maar in elk geval wel consistentquote: FreeBSDELF binary type "0" not known.
Abort
Vraag rest: wat is hier aan de hand? Waarom maakt die ene byte in het opvulgedeelte zo veel uit? Is het een bug in NetBSD-2.0 vanwege de 00 in de opvulbyte reeks? Nee, want alle andere binaries hebben ook 00 als eerste byte in de opvulreeks in de ELF-header. Een bug in de linker? Zeer onwaarschijnlijk. Zoiets valt natuurlijk meteen op bij het builden van het systeem. Bovendien doet het probleem zich ook voor met andere versies (ook die van CVS) van ld. Is mijn programma dan foutief? En zo ja, waarom werkt het dan wel in FreeBSD en NetBSD-1.6.2. Als iemand mij het kan vertellen: GRAAG
code:
1
| % ld -version |
quote: FreeBSDGNU ld version 2.12.1 [FreeBSD] 2002-07-20
Copyright 2002 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License. This program has absolutely no warranty.
quote: NetBSD-2.0GNU ld version 2.14 20030612
Copyright 2002 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License. This program has absolutely no warranty.
quote: NetBSD-1.6.2GNU ld 2.11.2
Copyright 2001 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License. This program has absolutely no warranty.
Supported emulations:
elf_i386
i386nbsd
Nog wat binaries ter onderwerping aan naar ik hoop het alziend oog van mijn mede-tweakers:
- broncode programma;
- NetBSD-2.0 versie van het progsel (werkt alleen op NetBSD-1.62);
- NetBSD-1.6.2 versie (werkt alleen op NetBSD-1.6.2);
- FreeBSD versie (werkt overal);
- core dump NetBSD-2.0 versie en tenslotte de
- object code (overal hetzelfde).
[ Voor 3% gewijzigd door Verwijderd op 15-12-2004 13:04 ]