-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[AIX] Fix XCOFF metadata #118905
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[AIX] Fix XCOFF metadata #118905
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
|
@@ -158,12 +158,13 @@ pub(super) fn get_metadata_xcoff<'a>(path: &Path, data: &'a [u8]) -> Result<&'a | |||
file.symbols().find(|sym| sym.name() == Ok(AIX_METADATA_SYMBOL_NAME)) | ||||
{ | ||||
let offset = metadata_symbol.address() as usize; | ||||
if offset < 8 { | ||||
// The offset specifies the location of rustc metadata in the .info section of XCOFF. | ||||
// Each string stored in .info section of XCOFF is preceded by a 4-byte lenght field. | ||||
if offset < 4 { | ||||
return Err(format!("Invalid metadata symbol offset: {offset}")); | ||||
} | ||||
// The offset specifies the location of rustc metadata in the comment section. | ||||
// The metadata is preceded by a 8-byte length field. | ||||
let len = u64::from_le_bytes(info_data[(offset - 8)..offset].try_into().unwrap()) as usize; | ||||
// XCOFF format uses big-endian byte order. | ||||
let len = u32::from_be_bytes(info_data[(offset - 4)..offset].try_into().unwrap()) as usize; | ||||
if offset + len > (info_data.len() as usize) { | ||||
return Err(format!( | ||||
"Metadata at offset {offset} with size {len} is beyond .info section" | ||||
|
@@ -478,9 +479,9 @@ pub fn create_wrapper_file( | |||
file.add_section(Vec::new(), b".text".to_vec(), SectionKind::Text); | ||||
file.section_mut(section).flags = | ||||
SectionFlags::Xcoff { s_flags: xcoff::STYP_INFO as u32 }; | ||||
|
||||
let len = data.len() as u64; | ||||
let offset = file.append_section_data(section, &len.to_le_bytes(), 1); | ||||
// Encode string stored in .info section of XCOFF. | ||||
let len = data.len() as u32; | ||||
let offset = file.append_section_data(section, &len.to_be_bytes(), 1); | ||||
// Add a symbol referring to the data in .info section. | ||||
file.add_symbol(Symbol { | ||||
name: AIX_METADATA_SYMBOL_NAME.into(), | ||||
|
@@ -599,12 +600,12 @@ pub fn create_compressed_metadata_file_for_xcoff( | |||
section: SymbolSection::Section(data_section), | ||||
flags: SymbolFlags::None, | ||||
}); | ||||
let len = data.len() as u64; | ||||
let offset = file.append_section_data(section, &len.to_le_bytes(), 1); | ||||
let len = data.len() as u32; | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The length of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. At the very least there is a session:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @bzEq even though we panic above, this should also be |
||||
let offset = file.append_section_data(section, &len.to_be_bytes(), 1); | ||||
// Add a symbol referring to the rustc metadata. | ||||
file.add_symbol(Symbol { | ||||
name: AIX_METADATA_SYMBOL_NAME.into(), | ||||
value: offset + 8, // The metadata is preceded by a 8-byte length field. | ||||
value: offset + 4, // The metadata is preceded by a 4-byte length field. | ||||
size: 0, | ||||
kind: SymbolKind::Unknown, | ||||
scope: SymbolScope::Dynamic, | ||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.