Apologies for any typos...
Well guys, been researching 'goto' in C and they say that you can't 'goto' labels in another function as a segmentation fault will occur.
However I have found a way to 'goto' a label in another function that is NOT main()
using the asm()
function.
As you know I love doing things with languages that they were not designed to do.
This works on gcc 2.95.3, gcc 4.2.1 and gcc 7.3.0. AMIGA OS 3.0.x using ADE, OSX 10.14.3 and Linux Mint 19.
Although I am aware of what is happening, what I don't understand is why gcc and/or its assembler, (? 'as' ?), up to at least version 7.3.0 does not give a warning or error report and NOT allow compilation.
I don't have the current gcc which I think is version 8.2.0 so it might have been found now.
#include <stdio.h>
/* NO segmentation fault? */
void test1()
{
/* This never sees 'return' nor the second 'nop'. */
asm(
"nop;"
"jmp jump_test2;"
"nop;"
);
printf("This will never be seen!\n");
return;
}
void test2()
{
/* The 'test2:' label sits in here. */
asm(
"nop;"
"jump_test2:"
"nop;"
);
printf("This will be printed.\n");
return;
}
int main()
{
test1();
printf("Hello World!\n");
return(0);
}
Results on OSX 10.14.3, default bash terminal, gcc 4.2.1.
Last login: Wed Mar 27 20:28:14 on ttys000
AMIGA:amiga~> cd Desktop/Code/C
AMIGA:amiga~/Desktop/Code/C> gcc cross_function_jump.c
AMIGA:amiga~/Desktop/Code/C> ./a.out
This will be printed.
Hello World!
AMIGA:amiga~/Desktop/Code/C> hexdump -C a.out
00000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00 |................|
00000010 0f 00 00 00 c0 04 00 00 85 00 20 00 00 00 00 00 |.......... .....|
00000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45 |....H...__PAGEZE|
00000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |RO..............|
00000040 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 19 00 00 00 d8 01 00 00 |................|
00000070 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 |__TEXT..........|
00000080 00 00 00 00 01 00 00 00 00 10 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 |................|
000000a0 07 00 00 00 05 00 00 00 05 00 00 00 00 00 00 00 |................|
000000b0 5f 5f 74 65 78 74 00 00 00 00 00 00 00 00 00 00 |__text..........|
000000c0 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 |__TEXT..........|
000000d0 b0 0e 00 00 01 00 00 00 8f 00 00 00 00 00 00 00 |................|
000000e0 b0 0e 00 00 04 00 00 00 00 00 00 00 00 00 00 00 |................|
000000f0 00 04 00 80 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000100 5f 5f 73 74 75 62 73 00 00 00 00 00 00 00 00 00 |__stubs.........|
00000110 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 |__TEXT..........|
00000120 40 0f 00 00 01 00 00 00 06 00 00 00 00 00 00 00 |@...............|
00000130 40 0f 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |@...............|
00000140 08 04 00 80 00 00 00 00 06 00 00 00 00 00 00 00 |................|
00000150 5f 5f 73 74 75 62 5f 68 65 6c 70 65 72 00 00 00 |__stub_helper...|
00000160 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 |__TEXT..........|
00000170 48 0f 00 00 01 00 00 00 1a 00 00 00 00 00 00 00 |H...............|
00000180 48 0f 00 00 02 00 00 00 00 00 00 00 00 00 00 00 |H...............|
00000190 00 04 00 80 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 5f 5f 63 73 74 72 69 6e 67 00 00 00 00 00 00 00 |__cstring.......|
000001b0 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 |__TEXT..........|
000001c0 62 0f 00 00 01 00 00 00 3f 00 00 00 00 00 00 00 |b.......?.......|
000001d0 62 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |b...............|
000001e0 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001f0 5f 5f 75 6e 77 69 6e 64 5f 69 6e 66 6f 00 00 00 |__unwind_info...|
00000200 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 |__TEXT..........|
00000210 a4 0f 00 00 01 00 00 00 54 00 00 00 00 00 00 00 |........T.......|
00000220 a4 0f 00 00 02 00 00 00 00 00 00 00 00 00 00 00 |................|
00000230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000240 19 00 00 00 e8 00 00 00 5f 5f 44 41 54 41 00 00 |........__DATA..|
00000250 00 00 00 00 00 00 00 00 00 10 00 00 01 00 00 00 |................|
00000260 00 10 00 00 00 00 00 00 00 10 00 00 00 00 00 00 |................|
00000270 00 10 00 00 00 00 00 00 07 00 00 00 03 00 00 00 |................|
00000280 02 00 00 00 00 00 00 00 5f 5f 6e 6c 5f 73 79 6d |........__nl_sym|
00000290 62 6f 6c 5f 70 74 72 00 5f 5f 44 41 54 41 00 00 |bol_ptr.__DATA..|
000002a0 00 00 00 00 00 00 00 00 00 10 00 00 01 00 00 00 |................|
000002b0 10 00 00 00 00 00 00 00 00 10 00 00 03 00 00 00 |................|
000002c0 00 00 00 00 00 00 00 00 06 00 00 00 01 00 00 00 |................|
000002d0 00 00 00 00 00 00 00 00 5f 5f 6c 61 5f 73 79 6d |........__la_sym|
000002e0 62 6f 6c 5f 70 74 72 00 5f 5f 44 41 54 41 00 00 |bol_ptr.__DATA..|
000002f0 00 00 00 00 00 00 00 00 10 10 00 00 01 00 00 00 |................|
00000300 08 00 00 00 00 00 00 00 10 10 00 00 03 00 00 00 |................|
00000310 00 00 00 00 00 00 00 00 07 00 00 00 03 00 00 00 |................|
00000320 00 00 00 00 00 00 00 00 19 00 00 00 48 00 00 00 |............H...|
00000330 5f 5f 4c 49 4e 4b 45 44 49 54 00 00 00 00 00 00 |__LINKEDIT......|
00000340 00 20 00 00 01 00 00 00 00 10 00 00 00 00 00 00 |. ..............|
00000350 00 20 00 00 00 00 00 00 50 01 00 00 00 00 00 00 |. ......P.......|
00000360 07 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |................|
00000370 22 00 00 80 30 00 00 00 00 20 00 00 08 00 00 00 |"...0.... ......|
00000380 08 20 00 00 18 00 00 00 00 00 00 00 00 00 00 00 |. ..............|
00000390 20 20 00 00 10 00 00 00 30 20 00 00 48 00 00 00 | ......0 ..H...|
000003a0 02 00 00 00 18 00 00 00 80 20 00 00 07 00 00 00 |......... ......|
000003b0 00 21 00 00 50 00 00 00 0b 00 00 00 50 00 00 00 |.!..P.......P...|
000003c0 00 00 00 00 01 00 00 00 01 00 00 00 04 00 00 00 |................|
000003d0 05 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 |................|
000003e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000003f0 f0 20 00 00 04 00 00 00 00 00 00 00 00 00 00 00 |. ..............|
00000400 00 00 00 00 00 00 00 00 0e 00 00 00 20 00 00 00 |............ ...|
00000410 0c 00 00 00 2f 75 73 72 2f 6c 69 62 2f 64 79 6c |..../usr/lib/dyl|
00000420 64 00 00 00 00 00 00 00 1b 00 00 00 18 00 00 00 |d...............|
00000430 4f 70 c6 4a 81 dc 38 76 93 62 3b d6 09 bd 94 37 |Op.J..8v.b;....7|
00000440 32 00 00 00 20 00 00 00 01 00 00 00 00 0e 0a 00 |2... ...........|
00000450 00 0e 0a 00 01 00 00 00 03 00 00 00 00 0c 99 01 |................|
00000460 2a 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 |*...............|
00000470 28 00 00 80 18 00 00 00 10 0f 00 00 00 00 00 00 |(...............|
00000480 00 00 00 00 00 00 00 00 0c 00 00 00 38 00 00 00 |............8...|
00000490 18 00 00 00 02 00 00 00 05 c8 e4 04 00 00 01 00 |................|
000004a0 2f 75 73 72 2f 6c 69 62 2f 6c 69 62 53 79 73 74 |/usr/lib/libSyst|
000004b0 65 6d 2e 42 2e 64 79 6c 69 62 00 00 00 00 00 00 |em.B.dylib......|
000004c0 26 00 00 00 10 00 00 00 78 20 00 00 08 00 00 00 |&.......x ......|
000004d0 29 00 00 00 10 00 00 00 80 20 00 00 00 00 00 00 |)........ ......|
000004e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000eb0 55 48 89 e5 48 83 ec 10 90 e9 2b 00 00 00 90 48 |UH..H.....+....H|
00000ec0 8d 3d 9c 00 00 00 b0 00 e8 73 00 00 00 89 45 fc |.=.......s....E.|
00000ed0 48 83 c4 10 5d c3 66 2e 0f 1f 84 00 00 00 00 00 |H...].f.........|
00000ee0 55 48 89 e5 48 83 ec 10 90 90 48 8d 3d 8b 00 00 |UH..H.....H.=...|
00000ef0 00 b0 00 e8 48 00 00 00 89 45 fc 48 83 c4 10 5d |....H....E.H...]|
00000f00 c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 |.ffffff.........|
00000f10 55 48 89 e5 48 83 ec 10 c7 45 fc 00 00 00 00 e8 |UH..H....E......|
00000f20 8c ff ff ff 48 8d 3d 68 00 00 00 b0 00 e8 0e 00 |....H.=h........|
00000f30 00 00 31 c9 89 45 f8 89 c8 48 83 c4 10 5d c3 90 |..1..E...H...]..|
00000f40 ff 25 ca 00 00 00 00 00 4c 8d 1d b9 00 00 00 41 |.%......L......A|
00000f50 53 ff 25 a9 00 00 00 90 68 00 00 00 00 e9 e6 ff |S.%.....h.......|
00000f60 ff ff 54 68 69 73 20 77 69 6c 6c 20 6e 65 76 65 |..This will neve|
00000f70 72 20 62 65 20 73 65 65 6e 21 0a 00 54 68 69 73 |r be seen!..This|
00000f80 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65 64 | will be printed|
00000f90 2e 0a 00 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 0a |...Hello World!.|
00000fa0 00 00 00 00 01 00 00 00 1c 00 00 00 01 00 00 00 |................|
00000fb0 20 00 00 00 00 00 00 00 20 00 00 00 02 00 00 00 | ....... .......|
00000fc0 00 00 00 01 b0 0e 00 00 38 00 00 00 38 00 00 00 |........8...8...|
00000fd0 40 0f 00 00 00 00 00 00 38 00 00 00 03 00 00 00 |@.......8.......|
00000fe0 0c 00 03 00 18 00 01 00 00 00 00 00 39 00 00 01 |............9...|
00000ff0 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |`...............|
00001000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001010 58 0f 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |X...............|
00001020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002000 11 22 10 51 00 00 00 00 11 40 64 79 6c 64 5f 73 |.".Q.....@dyld_s|
00002010 74 75 62 5f 62 69 6e 64 65 72 00 51 72 00 90 00 |tub_binder.Qr...|
00002020 72 10 11 40 5f 70 72 69 6e 74 66 00 90 00 00 00 |r..@_printf.....|
00002030 00 01 5f 00 05 00 03 5f 6d 68 5f 65 78 65 63 75 |.._...._mh_execu|
00002040 74 65 5f 68 65 61 64 65 72 00 27 74 65 73 74 00 |te_header.'test.|
00002050 2b 6d 61 69 6e 00 3d 02 00 00 00 00 02 31 00 33 |+main.=......1.3|
00002060 32 00 38 03 00 b0 1d 00 03 00 e0 1d 00 03 00 90 |2.8.............|
00002070 1e 00 00 00 00 00 00 00 b0 1d 30 09 27 00 00 00 |..........0.'...|
00002080 43 00 00 00 0e 01 00 00 e9 0e 00 00 01 00 00 00 |C...............|
00002090 02 00 00 00 0f 01 10 00 00 00 00 00 01 00 00 00 |................|
000020a0 16 00 00 00 0f 01 00 00 10 0f 00 00 01 00 00 00 |................|
000020b0 1c 00 00 00 0f 01 00 00 b0 0e 00 00 01 00 00 00 |................|
000020c0 23 00 00 00 0f 01 00 00 e0 0e 00 00 01 00 00 00 |#...............|
000020d0 2a 00 00 00 01 00 00 01 00 00 00 00 00 00 00 00 |*...............|
000020e0 32 00 00 00 01 00 00 01 00 00 00 00 00 00 00 00 |2...............|
000020f0 05 00 00 00 06 00 00 00 00 00 00 40 05 00 00 00 |...........@....|
00002100 20 00 5f 5f 6d 68 5f 65 78 65 63 75 74 65 5f 68 | .__mh_execute_h|
00002110 65 61 64 65 72 00 5f 6d 61 69 6e 00 5f 74 65 73 |eader._main._tes|
00002120 74 31 00 5f 74 65 73 74 32 00 5f 70 72 69 6e 74 |t1._test2._print|
00002130 66 00 64 79 6c 64 5f 73 74 75 62 5f 62 69 6e 64 |f.dyld_stub_bind|
00002140 65 72 00 6a 75 6d 70 5f 74 65 73 74 32 00 00 00 |er.jump_test2...|
00002150
AMIGA:amiga~/Desktop/Code/C> _
The important bit is this:
00000eb0 55 48 89 e5 48 83 ec 10 90 e9 2b 00 00 00 90 48 |UH..H.....+....H|
00000ec0 8d 3d 9c 00 00 00 b0 00 e8 73 00 00 00 89 45 fc |.=.......s....E.|
00000ed0 48 83 c4 10 5d c3 66 2e 0f 1f 84 00 00 00 00 00 |H...].f.........|
00000ee0 55 48 89 e5 48 83 ec 10 90 90 48 8d 3d 8b 00 00 |UH..H.....H.=...|
00000ef0 00 b0 00 e8 48 00 00 00 89 45 fc 48 83 c4 10 5d |....H....E.H...]|
00000f00 c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 |.ffffff.........|
00000f10 55 48 89 e5 48 83 ec 10 c7 45 fc 00 00 00 00 e8 |UH..H....E......|
00000f20 8c ff ff ff 48 8d 3d 68 00 00 00 b0 00 e8 0e 00 |....H.=h........|
00000f30 00 00 31 c9 89 45 f8 89 c8 48 83 c4 10 5d c3 90 |..1..E...H...]..|
00000f40 ff 25 ca 00 00 00 00 00 4c 8d 1d b9 00 00 00 41 |.%......L......A|
00000f50 53 ff 25 a9 00 00 00 90 68 00 00 00 00 e9 e6 ff |S.%.....h.......|
00000f60 ff ff 54 68 69 73 20 77 69 6c 6c 20 6e 65 76 65 |..This will neve|
00000f70 72 20 62 65 20 73 65 65 6e 21 0a 00 54 68 69 73 |r be seen!..This|
00000f80 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65 64 | will be printed|
00000f90 2e 0a 00 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 0a |...Hello World!.|
00000fa0 00 00 00 00 01 00 00 00 1c 00 00 00 01 00 00 00 |................|
From main(), test1()
is called which returns via the test2()
function and from reading the hexdump...
The "nop"s, ([0x]90), are only there for easy detection inside the hexdump...
So starting at the end of the first 'nop' in function test1()
the first instruction is a 32 bit jump of length 43, ([0x]2b), bytes.
So at byte position '00000ec9' we get:
e9 2b 00 00 00
which brings you inside the second function 'nop' located at byte position '00000ee8' ready to execute the next 'nop' instruction.
And from then runs the second function which prints a string, the string in test1()
is ignored.