Fix GDB cannot work in release build
This commit is contained in:
parent
3e81b42912
commit
9f1fa883df
@ -63,7 +63,7 @@ EDL_C_SRCS := $(addprefix $(BUILD_DIR)/src/libos/,src/Enclave_t.c src/Enclave_t.
|
|||||||
EDL_C_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,src/Enclave_t.o)
|
EDL_C_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,src/Enclave_t.o)
|
||||||
BUILTIN_C_SRCS := $(sort $(wildcard src/builtin/*.c))
|
BUILTIN_C_SRCS := $(sort $(wildcard src/builtin/*.c))
|
||||||
BUILTIN_C_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,$(BUILTIN_C_SRCS:.c=.o))
|
BUILTIN_C_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,$(BUILTIN_C_SRCS:.c=.o))
|
||||||
C_SRCS := $(filter-out $(BUILTIN_C_SRCS),$(sort $(wildcard src/*.c src/*/*.c)))
|
C_SRCS := $(filter-out $(BUILTIN_C_SRCS),$(sort $(wildcard src/*.c src/*/*.c src/*/*/*.c)))
|
||||||
C_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,$(C_SRCS:.c=.o))
|
C_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,$(C_SRCS:.c=.o))
|
||||||
CXX_SRCS := $(sort $(wildcard src/*.cpp src/*/*.cpp))
|
CXX_SRCS := $(sort $(wildcard src/*.cpp src/*/*.cpp))
|
||||||
CXX_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,$(CXX_SRCS:.cpp=.o))
|
CXX_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,$(CXX_SRCS:.cpp=.o))
|
||||||
@ -73,6 +73,8 @@ S_OBJS := $(addprefix $(BUILD_DIR)/src/libos/,$(S_SRCS:.S=.o))
|
|||||||
ALL_BUILD_SUBDIRS := $(sort $(patsubst %/,%,$(dir $(LIBOS_SO) $(EDL_C_OBJS) $(BUILTIN_C_OBJS) $(C_OBJS) $(CXX_OBJS) $(S_OBJS)) $(RUST_TARGET_DIR) $(RUST_OUT_DIR)))
|
ALL_BUILD_SUBDIRS := $(sort $(patsubst %/,%,$(dir $(LIBOS_SO) $(EDL_C_OBJS) $(BUILTIN_C_OBJS) $(C_OBJS) $(CXX_OBJS) $(S_OBJS)) $(RUST_TARGET_DIR) $(RUST_OUT_DIR)))
|
||||||
|
|
||||||
C_COMMON_FLAGS := -fno-stack-protector -I./include/
|
C_COMMON_FLAGS := -fno-stack-protector -I./include/
|
||||||
|
# SGX GDB support
|
||||||
|
C_COMMON_FLAGS += -g
|
||||||
C_FLAGS := $(SGX_CFLAGS_T) $(C_COMMON_FLAGS)
|
C_FLAGS := $(SGX_CFLAGS_T) $(C_COMMON_FLAGS)
|
||||||
CXX_FLAGS := $(SGX_CXXFLAGS_T) $(C_COMMON_FLAGS)
|
CXX_FLAGS := $(SGX_CXXFLAGS_T) $(C_COMMON_FLAGS)
|
||||||
|
|
||||||
|
21
src/libos/src/process/spawn/gdb_hook_load_elf.c
Normal file
21
src/libos/src/process/spawn/gdb_hook_load_elf.c
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Providing debug symbol information to GDB.
|
||||||
|
*
|
||||||
|
* This function is left empty deliberately and should NOT be removed.
|
||||||
|
*
|
||||||
|
* When SGX GDB is attached to the enclave, a break point will be inserted at the beginning
|
||||||
|
* of this function. So when this function is called at runtime, GDB can capture the arguments
|
||||||
|
* of this function, which gives the name of a loaded ELF file and the memory location where
|
||||||
|
* the ELF is loaded in the enclave. With this information, GDB can translate memory addresses
|
||||||
|
* to symbol names, thus give meaningful debug information.
|
||||||
|
*
|
||||||
|
* `__attribute__((optimize("O0")))` is used to prevent the compiler from optimizing this function in
|
||||||
|
* unexpected way (e.g., eliminating this empty function).
|
||||||
|
*/
|
||||||
|
void __attribute__((optimize("O0"))) occlum_gdb_hook_load_elf(
|
||||||
|
uint64_t elf_base,
|
||||||
|
const char* elf_path,
|
||||||
|
uint64_t elf_path_len) {
|
||||||
|
}
|
@ -41,10 +41,6 @@ pub fn do_spawn_without_exec(
|
|||||||
Ok(new_tid)
|
Ok(new_tid)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function is used to provide information to debugger, so it is empty. Please do not remove it.
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn occlum_gdb_hook_load_elf(elf_base: u64, elf_path: &str, elf_path_len: usize) {}
|
|
||||||
|
|
||||||
fn new_process(
|
fn new_process(
|
||||||
elf_path: &str,
|
elf_path: &str,
|
||||||
argv: &[CString],
|
argv: &[CString],
|
||||||
@ -70,9 +66,21 @@ fn new_process(
|
|||||||
|
|
||||||
// Notify debugger to load the symbols from elf file
|
// Notify debugger to load the symbols from elf file
|
||||||
let ldso_elf_base = vm.get_elf_ranges()[1].start() as u64;
|
let ldso_elf_base = vm.get_elf_ranges()[1].start() as u64;
|
||||||
occlum_gdb_hook_load_elf(ldso_elf_base, ldso_path, ldso_path.len());
|
unsafe {
|
||||||
|
occlum_gdb_hook_load_elf(
|
||||||
|
ldso_elf_base,
|
||||||
|
ldso_path.as_ptr() as *const u8,
|
||||||
|
ldso_path.len() as u64,
|
||||||
|
);
|
||||||
|
}
|
||||||
let exec_elf_base = vm.get_elf_ranges()[0].start() as u64;
|
let exec_elf_base = vm.get_elf_ranges()[0].start() as u64;
|
||||||
occlum_gdb_hook_load_elf(exec_elf_base, elf_path, elf_path.len());
|
unsafe {
|
||||||
|
occlum_gdb_hook_load_elf(
|
||||||
|
exec_elf_base,
|
||||||
|
elf_path.as_ptr() as *const u8,
|
||||||
|
elf_path.len() as u64,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let task = {
|
let task = {
|
||||||
let ldso_entry = {
|
let ldso_entry = {
|
||||||
@ -227,4 +235,5 @@ fn parent_adopts_new_child(parent_ref: &ProcessRef, child_ref: &ProcessRef) {
|
|||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn __occlum_syscall(num: i32, arg0: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64) -> i64;
|
fn __occlum_syscall(num: i32, arg0: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64) -> i64;
|
||||||
|
fn occlum_gdb_hook_load_elf(elf_base: u64, elf_path: *const u8, elf_path_len: u64);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user