feat: add SCF format library and rename components to SCC prefix

- Introduce new SCF (SCC Format) library with header, implementation, and test files
- SCF is a minimal executable/linkable format focused on internal linking with external symbol import/export abstraction
- Rename lexer and lex_parser packages from 'smcc_' to 'scc_' prefix for consistency
- Update hashmap implementation to use 'scc_' prefix for types and structures
- Add build configuration for new format library with dependencies on libcore and libutils
This commit is contained in:
zzy
2025-12-11 17:29:12 +08:00
parent d88fa3b8d3
commit 3aaf3a3991
13 changed files with 1048 additions and 56 deletions

View File

@@ -0,0 +1,109 @@
/**
* @file test_scf.c
* @brief SCF format tests
*/
#include <scf_impl.h>
#include <stdio.h>
#include <string.h>
int main() {
printf("Testing SCF format implementation...\n");
// Test 1: Initialization
scf_t scf;
scf_init(&scf);
if (memcmp(scf.header.magic, SCF_MAGIC, 4) != 0) {
printf("FAIL: Magic number incorrect\n");
return 1;
}
if (scf.header.version != SCF_VERSION) {
printf("FAIL: Version incorrect\n");
return 1;
}
if (scf.header.arch != SCF_ARCH_UNKNOWN) {
printf("FAIL: Architecture incorrect\n");
return 1;
}
printf("Test 1 PASSED: Initialization successful\n");
// Test 2: Adding symbols
scf_sym_t sym = {0};
sym.name_offset = 0;
sym.scf_sym_type = SCF_SYM_TYPE_FUNC;
sym.scf_sym_bind = SCF_SYM_BIND_GLOBAL;
sym.scf_sym_vis = SCF_SYM_VIS_DEFAULT;
sym.scf_sect_type = SCF_SECT_CODE;
sym.scf_sect_offset = 0;
sym.scf_sym_size = 16;
if (!scf_add_sym(&scf, &sym)) {
printf("FAIL: Cannot add symbol\n");
return 1;
}
if (scf.header.sym_count != 1) {
printf("FAIL: Symbol count incorrect\n");
return 1;
}
printf("Test 2 PASSED: Symbol addition successful\n");
// Test 3: Adding relocations
scf_reloc_t reloc = {0};
reloc.offset = 0; // 偏移量
reloc.sym_idx = 0;
reloc.type = SCF_RELOC_ABS;
reloc.sect_type = SCF_SECT_CODE; // 代码段
reloc.addend = 0;
if (!scf_add_reloc(&scf, &reloc)) {
printf("FAIL: Cannot add relocation\n");
return 1;
}
if (scf.header.reloc_count != 1) {
printf("FAIL: Relocation count incorrect\n");
return 1;
}
printf("Test 3 PASSED: Relocation addition successful\n");
// Test 4: Checking validity
if (!scf_check_valid(&scf)) {
printf("FAIL: SCF structure invalid\n");
return 1;
}
printf("Test 4 PASSED: SCF structure valid\n");
// Test 5: Writing and reading
char buffer[1024];
if (!scf_write(&scf, buffer, sizeof(buffer))) {
printf("FAIL: Cannot write to buffer\n");
return 1;
}
scf_t scf2;
scf_init(&scf2);
if (!scf_parse(&scf2, buffer, sizeof(buffer))) {
printf("FAIL: Cannot read from buffer\n");
return 1;
}
// Compare the two structures
if (memcmp(&scf.header, &scf2.header, sizeof(scf_header_t)) != 0) {
printf("FAIL: Header mismatch\n");
return 1;
}
printf("Test 5 PASSED: Write/read successful\n");
printf("All tests passed!\n");
return 0;
}