rmodule: use program.ld for linking
Bring rmodule linking into the common linking method. The __rmodule_entry symbol was removed while using a more common _start symbol. The rmodtool will honor the entry point found within the ELF header. Add ENV_RMODULE so that one can distinguish the environment when generating linker scripts for rmodules. Lastly, directly use program.ld for the rmodule.ld linker script. BUG=chrome-os-partner:44827 BRANCH=None TEST=Built rambi and analyzed the relocatable ramstage, sipi_vector, and smm rmodules. Change-Id: Iaa499eb229d8171272add9ee6d27cff75e7534ac Signed-off-by: Aaron Durbin <adubin@chromium.org> Reviewed-on: http://review.coreboot.org/11517 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
parent
e5bad5cd3d
commit
dde7629e9c
|
@ -72,6 +72,9 @@ classes-y := ramstage romstage bootblock smm smmstub cpu_microcode libverstage v
|
||||||
# Add dynamic classes for rmodules
|
# Add dynamic classes for rmodules
|
||||||
$(foreach supported_arch,$(ARCH_SUPPORTED), \
|
$(foreach supported_arch,$(ARCH_SUPPORTED), \
|
||||||
$(eval $(call define_class,rmodules_$(supported_arch),$(supported_arch))))
|
$(eval $(call define_class,rmodules_$(supported_arch),$(supported_arch))))
|
||||||
|
# Provide a macro to determine environment for free standing rmodules.
|
||||||
|
$(foreach supported_arch,$(ARCH_SUPPORTED), \
|
||||||
|
$(eval rmodules_$(supported_arch)-generic-ccopts += -D__RMODULE__))
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
# Helper functions for math and various file placement matters.
|
# Helper functions for math and various file placement matters.
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
* Foundation, Inc.
|
* Foundation, Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <rules.h>
|
||||||
|
|
||||||
/* We use ELF as output format. So that we can debug the code in some form. */
|
/* We use ELF as output format. So that we can debug the code in some form. */
|
||||||
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
|
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
|
||||||
OUTPUT_ARCH(aarch64)
|
OUTPUT_ARCH(aarch64)
|
||||||
|
@ -26,7 +28,13 @@ PHDRS
|
||||||
to_load PT_LOAD;
|
to_load PT_LOAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __BOOTBLOCK__
|
#if ENV_BOOTBLOCK
|
||||||
TARGET(binary)
|
TARGET(binary)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* secmon uses rmodules */
|
||||||
|
#if ENV_RMODULE
|
||||||
|
ENTRY(_start)
|
||||||
|
#else
|
||||||
ENTRY(stage_entry)
|
ENTRY(stage_entry)
|
||||||
|
#endif
|
||||||
|
|
|
@ -136,12 +136,12 @@ ENDPROC(arm64_c_environment)
|
||||||
2002:
|
2002:
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
ENTRY(__rmodule_entry)
|
ENTRY(_start)
|
||||||
split_bsp_path
|
split_bsp_path
|
||||||
/* Save the arguments to secmon in x25 */
|
/* Save the arguments to secmon in x25 */
|
||||||
mov x25, x0
|
mov x25, x0
|
||||||
b arm64_c_environment
|
b arm64_c_environment
|
||||||
ENDPROC(__rmodule_entry)
|
ENDPROC(_start)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup SCTLR so that:
|
* Setup SCTLR so that:
|
||||||
|
|
|
@ -23,8 +23,6 @@ thread_stacks:
|
||||||
.code32
|
.code32
|
||||||
#endif
|
#endif
|
||||||
.globl _start
|
.globl _start
|
||||||
.globl __rmodule_entry
|
|
||||||
__rmodule_entry:
|
|
||||||
_start:
|
_start:
|
||||||
cli
|
cli
|
||||||
lgdt %cs:gdtaddr
|
lgdt %cs:gdtaddr
|
||||||
|
|
|
@ -24,7 +24,7 @@ PHDRS
|
||||||
to_load PT_LOAD;
|
to_load PT_LOAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ENV_RAMSTAGE
|
#if ENV_RAMSTAGE || ENV_RMODULE
|
||||||
ENTRY(_start)
|
ENTRY(_start)
|
||||||
#elif ENV_ROMSTAGE
|
#elif ENV_ROMSTAGE
|
||||||
ENTRY(protected_start)
|
ENTRY(protected_start)
|
||||||
|
|
|
@ -20,9 +20,9 @@ $(SIPI_DOTO): $(dir $(SIPI_ELF))sipi_vector.rmodules_$(ARCH-ramstage-y).o
|
||||||
$(CC_rmodules_$(ARCH-ramstage-y)) $(CFLAGS_rmodules_$(ARCH-ramstage-y)) -nostdlib -r -o $@ $^
|
$(CC_rmodules_$(ARCH-ramstage-y)) $(CFLAGS_rmodules_$(ARCH-ramstage-y)) -nostdlib -r -o $@ $^
|
||||||
|
|
||||||
ifeq ($(CONFIG_ARCH_RAMSTAGE_X86_32),y)
|
ifeq ($(CONFIG_ARCH_RAMSTAGE_X86_32),y)
|
||||||
$(eval $(call rmodule_link,$(SIPI_ELF), $(SIPI_ELF:.elf=.o), 0,x86_32))
|
$(eval $(call rmodule_link,$(SIPI_ELF), $(SIPI_DOTO), 0,x86_32))
|
||||||
else
|
else
|
||||||
$(eval $(call rmodule_link,$(SIPI_ELF), $(SIPI_ELF:.elf=.o), 0,x86_64))
|
$(eval $(call rmodule_link,$(SIPI_ELF), $(SIPI_DOTO), 0,x86_64))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(SIPI_BIN): $(SIPI_RMOD)
|
$(SIPI_BIN): $(SIPI_RMOD)
|
||||||
|
|
|
@ -56,10 +56,8 @@ ap_count:
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.code16
|
.code16
|
||||||
.global ap_start
|
.global _start
|
||||||
.global __rmodule_entry
|
_start:
|
||||||
__rmodule_entry:
|
|
||||||
ap_start:
|
|
||||||
cli
|
cli
|
||||||
xorl %eax, %eax
|
xorl %eax, %eax
|
||||||
movl %eax, %cr3 /* Invalidate TLB*/
|
movl %eax, %cr3 /* Invalidate TLB*/
|
||||||
|
@ -74,9 +72,9 @@ ap_start:
|
||||||
|
|
||||||
/* The gdtaddr needs to be releative to the data segment in order
|
/* The gdtaddr needs to be releative to the data segment in order
|
||||||
* to properly dereference it. The .text section comes first in an
|
* to properly dereference it. The .text section comes first in an
|
||||||
* rmodule so ap_start can be used as a proxy for the load address. */
|
* rmodule so _start can be used as a proxy for the load address. */
|
||||||
movl $(gdtaddr), %ebx
|
movl $(gdtaddr), %ebx
|
||||||
sub $(ap_start), %ebx
|
sub $(_start), %ebx
|
||||||
|
|
||||||
data32 lgdt (%ebx)
|
data32 lgdt (%ebx)
|
||||||
|
|
||||||
|
|
|
@ -59,10 +59,8 @@ fallback_stack_top:
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.code16
|
.code16
|
||||||
.global smm_handler_start
|
.global _start
|
||||||
.global __rmodule_entry
|
_start:
|
||||||
__rmodule_entry:
|
|
||||||
smm_handler_start:
|
|
||||||
movl $(smm_relocate_gdt), %ebx
|
movl $(smm_relocate_gdt), %ebx
|
||||||
data32 lgdt (%ebx)
|
data32 lgdt (%ebx)
|
||||||
|
|
||||||
|
|
|
@ -43,9 +43,9 @@
|
||||||
#define ARCH_STAGE_HAS_BSS_SECTION 1
|
#define ARCH_STAGE_HAS_BSS_SECTION 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Default is that currently ramstage and smm only has a heap. */
|
/* Default is that currently ramstage, smm, and rmodules have a heap. */
|
||||||
#ifndef ARCH_STAGE_HAS_HEAP_SECTION
|
#ifndef ARCH_STAGE_HAS_HEAP_SECTION
|
||||||
#define ARCH_STAGE_HAS_HEAP_SECTION (ENV_RAMSTAGE || ENV_SMM)
|
#define ARCH_STAGE_HAS_HEAP_SECTION (ENV_RAMSTAGE || ENV_SMM || ENV_RMODULE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define STR(x) #x
|
#define STR(x) #x
|
||||||
|
|
|
@ -73,9 +73,9 @@ struct rmodule {
|
||||||
};
|
};
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_RELOCATABLE_MODULES)
|
#if IS_ENABLED(CONFIG_RELOCATABLE_MODULES)
|
||||||
/* Rmodules have an entry point of named __rmodule_entry. */
|
/* Rmodules have an entry point of named _start. */
|
||||||
#define RMODULE_ENTRY(entry_) \
|
#define RMODULE_ENTRY(entry_) \
|
||||||
void __rmodule_entry(void *) __attribute__((alias (STRINGIFY(entry_))))
|
void _start(void *) __attribute__((alias (STRINGIFY(entry_))))
|
||||||
#else
|
#else
|
||||||
#define RMODULE_ENTRY(entry_)
|
#define RMODULE_ENTRY(entry_)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#define ENV_SMM 0
|
#define ENV_SMM 0
|
||||||
#define ENV_SECMON 0
|
#define ENV_SECMON 0
|
||||||
#define ENV_VERSTAGE 0
|
#define ENV_VERSTAGE 0
|
||||||
|
#define ENV_RMODULE 0
|
||||||
|
|
||||||
#elif defined(__ROMSTAGE__)
|
#elif defined(__ROMSTAGE__)
|
||||||
#define ENV_BOOTBLOCK 0
|
#define ENV_BOOTBLOCK 0
|
||||||
|
@ -38,6 +39,7 @@
|
||||||
#define ENV_SMM 0
|
#define ENV_SMM 0
|
||||||
#define ENV_SECMON 0
|
#define ENV_SECMON 0
|
||||||
#define ENV_VERSTAGE 0
|
#define ENV_VERSTAGE 0
|
||||||
|
#define ENV_RMODULE 0
|
||||||
|
|
||||||
#elif defined(__SMM__)
|
#elif defined(__SMM__)
|
||||||
#define ENV_BOOTBLOCK 0
|
#define ENV_BOOTBLOCK 0
|
||||||
|
@ -46,6 +48,7 @@
|
||||||
#define ENV_SMM 1
|
#define ENV_SMM 1
|
||||||
#define ENV_SECMON 0
|
#define ENV_SECMON 0
|
||||||
#define ENV_VERSTAGE 0
|
#define ENV_VERSTAGE 0
|
||||||
|
#define ENV_RMODULE 0
|
||||||
|
|
||||||
#elif defined(__SECMON__)
|
#elif defined(__SECMON__)
|
||||||
#define ENV_BOOTBLOCK 0
|
#define ENV_BOOTBLOCK 0
|
||||||
|
@ -54,6 +57,7 @@
|
||||||
#define ENV_SMM 0
|
#define ENV_SMM 0
|
||||||
#define ENV_SECMON 1
|
#define ENV_SECMON 1
|
||||||
#define ENV_VERSTAGE 0
|
#define ENV_VERSTAGE 0
|
||||||
|
#define ENV_RMODULE 0
|
||||||
|
|
||||||
#elif defined(__VERSTAGE__)
|
#elif defined(__VERSTAGE__)
|
||||||
#define ENV_BOOTBLOCK 0
|
#define ENV_BOOTBLOCK 0
|
||||||
|
@ -62,6 +66,7 @@
|
||||||
#define ENV_SMM 0
|
#define ENV_SMM 0
|
||||||
#define ENV_SECMON 0
|
#define ENV_SECMON 0
|
||||||
#define ENV_VERSTAGE 1
|
#define ENV_VERSTAGE 1
|
||||||
|
#define ENV_RMODULE 0
|
||||||
|
|
||||||
#elif defined(__RAMSTAGE__)
|
#elif defined(__RAMSTAGE__)
|
||||||
#define ENV_BOOTBLOCK 0
|
#define ENV_BOOTBLOCK 0
|
||||||
|
@ -70,6 +75,16 @@
|
||||||
#define ENV_SMM 0
|
#define ENV_SMM 0
|
||||||
#define ENV_SECMON 0
|
#define ENV_SECMON 0
|
||||||
#define ENV_VERSTAGE 0
|
#define ENV_VERSTAGE 0
|
||||||
|
#define ENV_RMODULE 0
|
||||||
|
|
||||||
|
#elif defined(__RMODULE__)
|
||||||
|
#define ENV_BOOTBLOCK 0
|
||||||
|
#define ENV_ROMSTAGE 0
|
||||||
|
#define ENV_RAMSTAGE 0
|
||||||
|
#define ENV_SMM 0
|
||||||
|
#define ENV_SECMON 0
|
||||||
|
#define ENV_VERSTAGE 0
|
||||||
|
#define ENV_RMODULE 1
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
|
@ -84,6 +99,7 @@
|
||||||
#define ENV_SMM 0
|
#define ENV_SMM 0
|
||||||
#define ENV_SECMON 0
|
#define ENV_SECMON 0
|
||||||
#define ENV_VERSTAGE 0
|
#define ENV_VERSTAGE 0
|
||||||
|
#define ENV_RMODULE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* For romstage and ramstage always build with simple device model, ie.
|
/* For romstage and ramstage always build with simple device model, ie.
|
||||||
|
|
|
@ -38,14 +38,14 @@
|
||||||
*(.text);
|
*(.text);
|
||||||
*(.text.*);
|
*(.text.*);
|
||||||
|
|
||||||
#if ENV_RAMSTAGE || ENV_ROMSTAGE
|
#if ENV_RAMSTAGE || ENV_ROMSTAGE || ENV_RMODULE
|
||||||
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
||||||
_cbmem_init_hooks = .;
|
_cbmem_init_hooks = .;
|
||||||
KEEP(*(.rodata.cbmem_init_hooks));
|
KEEP(*(.rodata.cbmem_init_hooks));
|
||||||
_ecbmem_init_hooks = .;
|
_ecbmem_init_hooks = .;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENV_RAMSTAGE
|
#if ENV_RAMSTAGE || ENV_RMODULE
|
||||||
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
||||||
_pci_drivers = .;
|
_pci_drivers = .;
|
||||||
KEEP(*(.rodata.pci_driver));
|
KEEP(*(.rodata.pci_driver));
|
||||||
|
@ -79,13 +79,20 @@
|
||||||
.data : {
|
.data : {
|
||||||
. = ALIGN(ARCH_CACHELINE_ALIGN_SIZE);
|
. = ALIGN(ARCH_CACHELINE_ALIGN_SIZE);
|
||||||
_data = .;
|
_data = .;
|
||||||
|
|
||||||
|
#if ENV_RMODULE
|
||||||
|
_rmodule_params = .;
|
||||||
|
KEEP(*(.module_parameters));
|
||||||
|
_ermodule_params = .;
|
||||||
|
#endif
|
||||||
|
|
||||||
*(.data);
|
*(.data);
|
||||||
*(.data.*);
|
*(.data.*);
|
||||||
|
|
||||||
#ifdef __PRE_RAM__
|
#ifdef __PRE_RAM__
|
||||||
PROVIDE(_preram_cbmem_console = .);
|
PROVIDE(_preram_cbmem_console = .);
|
||||||
PROVIDE(_epreram_cbmem_console = _preram_cbmem_console);
|
PROVIDE(_epreram_cbmem_console = _preram_cbmem_console);
|
||||||
#elif ENV_RAMSTAGE
|
#elif ENV_RAMSTAGE || ENV_RMODULE
|
||||||
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
||||||
_bs_init_begin = .;
|
_bs_init_begin = .;
|
||||||
KEEP(*(.bs_init));
|
KEEP(*(.bs_init));
|
||||||
|
@ -116,7 +123,7 @@
|
||||||
.heap : {
|
.heap : {
|
||||||
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
||||||
_heap = .;
|
_heap = .;
|
||||||
. += CONFIG_HEAP_SIZE;
|
. += (ENV_RMODULE ? __heap_size : CONFIG_HEAP_SIZE);
|
||||||
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
||||||
_eheap = .;
|
_eheap = .;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,103 +12,14 @@
|
||||||
* won't be a consistent mapping between the flat blob and the loaded program.
|
* won't be a consistent mapping between the flat blob and the loaded program.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
BASE_ADDRESS = 0x00000;
|
#include <memlayout.h>
|
||||||
|
#include <arch/header.ld>
|
||||||
ENTRY(__rmodule_entry);
|
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = BASE_ADDRESS;
|
SET_COUNTER(rmodule, 0x00000000)
|
||||||
|
|
||||||
.payload : {
|
/* program.ld is directly included because there's no one particular
|
||||||
/* C code of the module. */
|
* class that rmodule is used on. */
|
||||||
_program = .;
|
#include <lib/program.ld>
|
||||||
*(.text._start);
|
|
||||||
*(.text.stage_entry);
|
|
||||||
*(.text);
|
|
||||||
*(.text.*);
|
|
||||||
/* C read-only data. */
|
|
||||||
. = ALIGN(16);
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_COVERAGE)
|
|
||||||
__CTOR_LIST__ = .;
|
|
||||||
*(.ctors);
|
|
||||||
LONG(0);
|
|
||||||
LONG(0);
|
|
||||||
__CTOR_END__ = .;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The driver sections are to allow linking coreboot's
|
|
||||||
* ramstage with the rmodule linker. Any changes made in
|
|
||||||
* ramstage.ld should be made here as well. */
|
|
||||||
. = ALIGN(8);
|
|
||||||
_pci_drivers = . ;
|
|
||||||
KEEP(*(.rodata.pci_driver));
|
|
||||||
_epci_drivers = . ;
|
|
||||||
. = ALIGN(8);
|
|
||||||
_cpu_drivers = . ;
|
|
||||||
KEEP(*(.rodata.cpu_driver));
|
|
||||||
_ecpu_drivers = . ;
|
|
||||||
. = ALIGN(8);
|
|
||||||
_bs_init_begin = .;
|
|
||||||
KEEP(*(.bs_init));
|
|
||||||
LONG(0);
|
|
||||||
LONG(0);
|
|
||||||
_bs_init_end = .;
|
|
||||||
_cbmem_init_hooks = .;
|
|
||||||
KEEP(*(.rodata.cbmem_init_hooks));
|
|
||||||
_ecbmem_init_hooks = .;
|
|
||||||
|
|
||||||
. = ALIGN(8);
|
|
||||||
|
|
||||||
*(.rodata);
|
|
||||||
*(.rodata.*);
|
|
||||||
. = ALIGN(8);
|
|
||||||
|
|
||||||
/* The parameters section can be used to pass parameters
|
|
||||||
* to a module, however there has to be an prior agreement
|
|
||||||
* on how to interpret the parameters. */
|
|
||||||
_module_params_begin = .;
|
|
||||||
KEEP(*(.module_parameters));
|
|
||||||
_module_params_end = .;
|
|
||||||
. = ALIGN(8);
|
|
||||||
|
|
||||||
/* Data section. */
|
|
||||||
. = ALIGN(64); /* Mirror cache line alignment from ramstage. */
|
|
||||||
_sdata = .;
|
|
||||||
*(.data);
|
|
||||||
*(.data.*);
|
|
||||||
. = ALIGN(8);
|
|
||||||
_edata = .;
|
|
||||||
|
|
||||||
. = ALIGN(8);
|
|
||||||
}
|
|
||||||
|
|
||||||
.bss (NOLOAD) : {
|
|
||||||
/* C uninitialized data of the module. */
|
|
||||||
_bss = .;
|
|
||||||
*(.bss);
|
|
||||||
*(.bss.*)
|
|
||||||
*(.sbss)
|
|
||||||
*(.sbss.*)
|
|
||||||
*(COMMON);
|
|
||||||
. = ALIGN(8);
|
|
||||||
_ebss = .;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Place the heap after BSS. The heap size is passed in by
|
|
||||||
* by way of ld --defsym=__heap_size=<>
|
|
||||||
*/
|
|
||||||
_heap = .;
|
|
||||||
. = . + __heap_size;
|
|
||||||
_eheap = .;
|
|
||||||
_eprogram = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
/DISCARD/ : {
|
|
||||||
/* Drop unnecessary sections. */
|
|
||||||
*(.eh_frame);
|
|
||||||
*(.note);
|
|
||||||
*(.note.*);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -402,11 +402,11 @@ static int populate_program_info(struct rmod_context *ctx)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (populate_sym(ctx, "_module_params_begin", &ctx->parameters_begin,
|
if (populate_sym(ctx, "_rmodule_params", &ctx->parameters_begin,
|
||||||
nsyms, strtab))
|
nsyms, strtab))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (populate_sym(ctx, "_module_params_end", &ctx->parameters_end,
|
if (populate_sym(ctx, "_ermodule_params", &ctx->parameters_end,
|
||||||
nsyms, strtab))
|
nsyms, strtab))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -416,8 +416,8 @@ static int populate_program_info(struct rmod_context *ctx)
|
||||||
if (populate_sym(ctx, "_ebss", &ctx->bss_end, nsyms, strtab))
|
if (populate_sym(ctx, "_ebss", &ctx->bss_end, nsyms, strtab))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (populate_sym(ctx, "__rmodule_entry", &ctx->entry, nsyms, strtab))
|
/* Honor the entry point within the ELF header. */
|
||||||
return -1;
|
ctx->entry = ehdr->e_entry;
|
||||||
|
|
||||||
/* Link address is the virtual address of the program segment. */
|
/* Link address is the virtual address of the program segment. */
|
||||||
ctx->link_addr = ctx->phdr->p_vaddr;
|
ctx->link_addr = ctx->phdr->p_vaddr;
|
||||||
|
|
Loading…
Reference in New Issue