Default code for "Secrets" exercise in x86-64 crashes

Hi everyone!

I’ve tried starting the “Secrets” exercise of the x86-64 assembly track and whatever code I write, the compiler seems to crash. I’ve also tried the default code that loads into the online editor, as well as adding a simple “mov rax, 5”. In all cases, I get the log below. I’m still very new to assembly and programming in general, so I’m not sure if that crash is supposed to happen. Is there a chance to fix this? Thanks in advance for having a look at it!

/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_lower_bits_0b1010_0100_1100_0101':
/mnt/exercism-iteration/secrets_test.c:42: undefined reference to `extract_lower_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_lower_bits_0b0001_1100_0001_1100':
/mnt/exercism-iteration/secrets_test.c:47: undefined reference to `extract_lower_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_lower_bits_0b0000_0000_1111_1111':
/mnt/exercism-iteration/secrets_test.c:52: undefined reference to `extract_lower_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_lower_bits_0b1111_1111_0000_0000':
/mnt/exercism-iteration/secrets_test.c:57: undefined reference to `extract_lower_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_redundant_bits_0b1010_0100_1100_0101':
/mnt/exercism-iteration/secrets_test.c:63: undefined reference to `extract_redundant_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_redundant_bits_0b0001_1100_0001_1100':
/mnt/exercism-iteration/secrets_test.c:68: undefined reference to `extract_redundant_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_redundant_bits_0b0000_0000_1111_1111':
/mnt/exercism-iteration/secrets_test.c:73: undefined reference to `extract_redundant_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_redundant_bits_0b1111_1111_0000_0000':
/mnt/exercism-iteration/secrets_test.c:78: undefined reference to `extract_redundant_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_set_message_bits_0b1010_0100_1100_0101':
/mnt/exercism-iteration/secrets_test.c:84: undefined reference to `set_message_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_set_message_bits_0b0001_1100_0001_1100':
/mnt/exercism-iteration/secrets_test.c:89: undefined reference to `set_message_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_set_message_bits_0b0000_0000_1111_1111':
/mnt/exercism-iteration/secrets_test.c:94: undefined reference to `set_message_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_set_message_bits_0b1111_1111_0000_0000':
/mnt/exercism-iteration/secrets_test.c:99: undefined reference to `set_message_bits'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_rotate_private_key_0b1010_0100_1100_0101':
/mnt/exercism-iteration/secrets_test.c:105: undefined reference to `rotate_private_key'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_rotate_private_key_0b0001_1100_0001_1100':
/mnt/exercism-iteration/secrets_test.c:110: undefined reference to `rotate_private_key'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_rotate_private_key_0b0000_0000_1111_1111':
/mnt/exercism-iteration/secrets_test.c:115: undefined reference to `rotate_private_key'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_rotate_private_key_0b1111_1111_0000_0000':
/mnt/exercism-iteration/secrets_test.c:120: undefined reference to `rotate_private_key'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_format_private_key_0b1010_0100_1100_0101':
/mnt/exercism-iteration/secrets_test.c:126: undefined reference to `format_private_key'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_format_private_key_0b0001_1100_0001_1100':
/mnt/exercism-iteration/secrets_test.c:131: undefined reference to `format_private_key'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_format_private_key_0b0000_0000_1111_1111':
/mnt/exercism-iteration/secrets_test.c:136: undefined reference to `format_private_key'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_format_private_key_0b1111_1111_0000_0000':
/mnt/exercism-iteration/secrets_test.c:141: undefined reference to `format_private_key'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_decrypt_message_0b1010_0100_1100_0101':
/mnt/exercism-iteration/secrets_test.c:147: undefined reference to `decrypt_message'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_decrypt_message_0b0001_1100_0001_1100':
/mnt/exercism-iteration/secrets_test.c:152: undefined reference to `decrypt_message'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_decrypt_message_0b0000_0000_1111_1111':
/mnt/exercism-iteration/secrets_test.c:157: undefined reference to `decrypt_message'
/usr/lib/gcc/x86_64-alpine-linux-musl/12.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: secrets_test.o: in function `test_decrypt_message_0b1111_1111_0000_0000':
/mnt/exercism-iteration/secrets_test.c:162: undefined reference to `decrypt_message'
collect2: error: ld returned 1 exit status
make: *** [Makefile:32: tests] Error 1

These are linker errors saying that various functions could not be found. For example the last error message mentions decrypt_message

The bottom of the initial secrets.asm contains

; TODO: define the 'decrypt_message' function
; This function takes one 16-bit integer as argument
; It returns a 16-bit integer, of which:
; - The higher 8 bits are the formatted private key, according to 'format_private_key'
; - The lower 8 bits are the message with all bits set, according to 'set_message_bits'

We can add something like

global decrypt_message
decrypt_message:
    ; ...
    ret

and that last error message should no longer occur.

Ah, I see. Silly of me, I didn’t notice. Not sure if it would be necessary at this point, but for consistency with the previous exercises, it would probably help. Thanks a lot!