You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.4 KiB
Ruby

# frozen_string_literal: true
# SPDX-License-Identifier: MIT OR Apache-2.0
#
# Copyright (c) 2022 Andre Richter <andre.o.richter@gmail.com>
def generate_symbols(kernel_elf, output_file)
File.open(output_file, 'w') do |file|
header = <<~HEREDOC
use debug_symbol_types::Symbol;
# [no_mangle]
# [link_section = ".rodata.symbol_desc"]
static KERNEL_SYMBOLS: [Symbol; #{kernel_elf.num_symbols}] = [
HEREDOC
file.write(header)
kernel_elf.symbols.each do |sym|
value = sym.header.st_value
size = sym.header.st_size
name = sym.name
file.write(" Symbol::new(#{value}, #{size}, \"#{name}\"),\n")
end
file.write("];\n")
end
end
def get_symbols_section_virt_addr(kernel_elf)
kernel_elf.kernel_symbols_section_virt_addr
end
def patch_symbol_data(kernel_elf, symbols_blob_path)
symbols_blob = File.binread(symbols_blob_path)
raise if symbols_blob.size > kernel_elf.kernel_symbols_section_size
File.binwrite(kernel_elf.path, File.binread(symbols_blob_path),
kernel_elf.kernel_symbols_section_offset_in_file)
end
def patch_num_symbols(kernel_elf)
num_packed = [kernel_elf.num_symbols].pack('Q<*') # "Q" == uint64_t, "<" == little endian
File.binwrite(kernel_elf.path, num_packed, kernel_elf.num_kernel_symbols_offset_in_file)
end