[TUHS] recreating C source from binary

Oliver Lehmann lehmann at ans-netz.de
Mon Dec 19 08:26:47 AEST 2011


I'm trying to re-create the source files for the Z8000 UNIX I have
on my Z8000 system (it is a S8000+ZEUS clone).
Easy programs like sync.c where easy. But when argc/argv is involved,
I'm not able to generate 1:1 matching binary code.

I'm working on /etc/unlink for now.

I tried the following C file:

char whatstr[] = "@[$]unlink.c  2.1  07/23/82 21:19:30 - 87wega3.2";

main(argc, argv)
int argc;
char **argv;
         if(argc!=2) {
                 write(2, "Usage: /etc/unlink name\n", 24);

The original ASM code for the beginning of main() until the argc
check is:

0042                 abf3  dec     r15,#4
0044             5df60000  ldl     %0000(r15),rr6
0048             0b070002  cp      r7,#%0002

The ASM code my C file generates is:

0042                 abf3  dec     r15,#4
0044                 1df6  ldl     @r15,rr6
0046             0b070002  cp      r7,#%0002

keep in mine, that r15 is considered as the "stack pointer".

I wonder how to get the ldl from the original binary.
I also tried to declare argv with "char *argv[]" which
resulted in the same code. Forcing the compiler to store
argv into a register by using the "register" keyword results
in completly different code:

(sp = stack pointer = r15)

#17 adb unlink
ADB: P8000 1.6
? 0x0042/i
%0042:          dec     sp,#6
%0044:          ld      %0004(sp),r14
%0048:          ld      %0002(sp),r7
%004c:          ld      r14,r6
%004e:          cp      r7,#%0002
? $q

Maybe  the C compiler used to compile /etc/unlink differs from
the C compiler shipped with the system (maybe an older version)
but I don't want this to be true for now ;)

Anyone with deeper ASM and C knowledge than me sees what could
be done here?

Before someone asks - yes I'm sure the source file was in C
and not ASM based on the whatstr. Symboltable of the original
/etc/unlink is empty as well (striped binary).

Regards, Oliver

More information about the TUHS mailing list