1 use super::prelude::*; 2 use crate::protocol::commands::ext::SectionOffsets; 3 4 impl<T: Target, C: Connection> GdbStubImpl<T, C> { handle_section_offsets( &mut self, res: &mut ResponseWriter<'_, C>, target: &mut T, command: SectionOffsets, ) -> Result<HandlerStatus, Error<T::Error, C::Error>>5 pub(crate) fn handle_section_offsets( 6 &mut self, 7 res: &mut ResponseWriter<'_, C>, 8 target: &mut T, 9 command: SectionOffsets, 10 ) -> Result<HandlerStatus, Error<T::Error, C::Error>> { 11 let ops = match target.support_section_offsets() { 12 Some(ops) => ops, 13 None => return Ok(HandlerStatus::Handled), 14 }; 15 16 crate::__dead_code_marker!("section_offsets", "impl"); 17 18 let handler_status = match command { 19 SectionOffsets::qOffsets(_cmd) => { 20 use crate::target::ext::section_offsets::Offsets; 21 22 match ops.get_section_offsets().map_err(Error::TargetError)? { 23 Offsets::Sections { text, data, bss } => { 24 res.write_str("Text=")?; 25 res.write_num(text)?; 26 27 res.write_str(";Data=")?; 28 res.write_num(data)?; 29 30 // "Note: while a Bss offset may be included in the response, 31 // GDB ignores this and instead applies the Data offset to the Bss section." 32 // 33 // While this would suggest that it's OK to omit `Bss=` entirely, recent 34 // versions of GDB seem to require that `Bss=` is present. 35 // 36 // See https://github.com/bminor/binutils-gdb/blob/master/gdb/remote.c#L4149-L4159 37 let bss = bss.unwrap_or(data); 38 res.write_str(";Bss=")?; 39 res.write_num(bss)?; 40 } 41 Offsets::Segments { text_seg, data_seg } => { 42 res.write_str("TextSeg=")?; 43 res.write_num(text_seg)?; 44 45 if let Some(data) = data_seg { 46 res.write_str(";DataSeg=")?; 47 res.write_num(data)?; 48 } 49 } 50 } 51 HandlerStatus::Handled 52 } 53 }; 54 55 Ok(handler_status) 56 } 57 } 58