1import os 2import sys 3import subprocess 4 5arguments = sys.argv[2] 6vdso_usr = arguments 7vdso_path = os.path.join(vdso_usr, '..', '..', '..') 8 9EXEC_PATH = os.getenv('RTT_EXEC_PATH') or '/usr/bin' 10PREFIX = os.getenv('RTT_CC_PREFIX') or 'riscv64-none-elf-' 11 12def get_riscv64_default_arch_abi(gcc_bin): 13 try: 14 result = subprocess.check_output( 15 [gcc_bin, '-Q', '--help=target'], 16 universal_newlines=True 17 ) 18 arch = None 19 abi = None 20 for line in result.splitlines(): 21 if '-march=' in line: 22 arch = line.strip().split()[1] 23 arch = arch.split('_')[0] # Get the base architecture, e.g., rv64imafdc 24 if '-mabi=' in line and 'option' not in line: 25 abi = line.strip().split()[1] 26 return arch, abi 27 except Exception as e: 28 print("Error getting arch/abi:", e) 29 return None, None 30 31# get the gcc path 32CC_BIN = PREFIX + 'gcc' 33arch, abi = get_riscv64_default_arch_abi(CC_BIN) 34if arch and abi: 35 DEVICE = f' -march={arch} -mabi={abi} ' 36else: 37 DEVICE = ' -march=rv64imafdc -mabi=lp64' # fallback 38 39CC = PREFIX + 'gcc' 40CPP = PREFIX + 'cpp' 41AS = PREFIX + 'gcc' 42AR = PREFIX + 'ar' 43LINK = PREFIX + 'gcc' 44 45AFLAGS = ' -x assembler-with-cpp' 46CFLAGS = DEVICE + ' -Wall -Wno-cpp -std=gnu99 -fdiagnostics-color=always -fPIC -O2' 47LFLAGS = DEVICE + ' -Bsymbolic -Wl,--gc-sections -T {path}/vdso.lds'.format(path=vdso_usr) 48CFLAGS += " -I . -I {vdso_path} ".format(vdso_path=vdso_path) 49 50src = Glob('*.c') 51env = Environment(tools=['gcc', 'link'], 52 AS = AS, ASFLAGS = AFLAGS, 53 CC = CC, CFLAGS = CFLAGS, 54 CPP = CPP, AR = AR, 55 LINK = LINK, LINKFLAGS = LFLAGS) 56env.PrependENVPath('PATH', EXEC_PATH) 57 58target = os.path.join(vdso_path, 'user', 'build', 'libvdso.so') 59shared_lib = env.SharedLibrary(target=target, source=src) 60Clean(shared_lib, '{vdso_usr}/vdso.lds'.format(vdso_usr=vdso_usr)) 61Clean(shared_lib, '.sconsign.dblite') 62env.Default(shared_lib) 63