Skip to content

Commit 2c0e5f1

Browse files
committed
Remove globalize_symbols test
1 parent d3596db commit 2c0e5f1

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
lines changed

src/cmd/dol.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ pub struct ProjectConfig {
234234
/// Marks all emitted symbols as "exported" to prevent the linker from removing them.
235235
#[serde(default = "bool_true", skip_serializing_if = "is_true")]
236236
pub export_all: bool,
237+
/// Promotes local symbols referenced by other units to global.
238+
#[serde(default = "bool_true", skip_serializing_if = "is_true")]
239+
pub globalize_symbols: bool,
237240
/// Optional base path for all object files.
238241
#[serde(with = "unix_path_serde_option", default, skip_serializing_if = "is_default")]
239242
pub object_base: Option<Utf8UnixPathBuf>,
@@ -259,6 +262,7 @@ impl Default for ProjectConfig {
259262
symbols_known: false,
260263
fill_gaps: true,
261264
export_all: true,
265+
globalize_symbols: true,
262266
object_base: None,
263267
extract_objects: true,
264268
}
@@ -967,7 +971,7 @@ fn split_write_obj(
967971

968972
debug!("Splitting {} objects", module.obj.link_order.len());
969973
let module_name = module.config.name().to_string();
970-
let split_objs = split_obj(&module.obj, Some(module_name.as_str()))?;
974+
let split_objs = split_obj(&module.obj, Some(module_name.as_str()), config.globalize_symbols)?;
971975

972976
debug!("Writing object files");
973977
DirBuilder::new()

src/cmd/elf.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ fn disasm(args: DisasmArgs) -> Result<()> {
136136
match obj.kind {
137137
ObjKind::Executable => {
138138
log::info!("Splitting {} objects", obj.link_order.len());
139-
let split_objs = split_obj(&obj, None)?;
139+
let split_objs = split_obj(&obj, None, false)?;
140140

141141
let asm_dir = args.out.join("asm");
142142
let include_dir = args.out.join("include");

src/util/split.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -992,7 +992,11 @@ fn resolve_link_order(obj: &ObjInfo) -> Result<Vec<ObjUnit>> {
992992

993993
/// Split an object into multiple relocatable objects.
994994
#[instrument(level = "debug", skip(obj))]
995-
pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo>> {
995+
pub fn split_obj(
996+
obj: &ObjInfo,
997+
module_name: Option<&str>,
998+
globalize_symbols: bool,
999+
) -> Result<Vec<ObjInfo>> {
9961000
let mut objects: Vec<ObjInfo> = vec![];
9971001
let mut object_symbols: Vec<Vec<Option<SymbolIndex>>> = vec![];
9981002
let mut name_to_obj: HashMap<String, usize> = HashMap::new();
@@ -1215,7 +1219,7 @@ pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo
12151219
}
12161220

12171221
// Update relocations
1218-
let mut globalize_symbols = vec![];
1222+
let mut symbols_to_globalize = vec![];
12191223
for (obj_idx, out_obj) in objects.iter_mut().enumerate() {
12201224
let symbol_idxs = &mut object_symbols[obj_idx];
12211225
for (_section_index, section) in out_obj.sections.iter_mut() {
@@ -1231,7 +1235,7 @@ pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo
12311235

12321236
// If the symbol is local, we'll upgrade the scope to global
12331237
// and rename it to avoid conflicts
1234-
if target_sym.flags.is_local() {
1238+
if globalize_symbols && target_sym.flags.is_local() {
12351239
let address_str = if obj.module_id == 0 {
12361240
format!("{:08X}", target_sym.address)
12371241
} else if let Some(section_index) = target_sym.section {
@@ -1250,7 +1254,7 @@ pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo
12501254
} else {
12511255
format!("{}_{}", target_sym.name, address_str)
12521256
};
1253-
globalize_symbols.push((reloc.target_symbol, new_name));
1257+
symbols_to_globalize.push((reloc.target_symbol, new_name));
12541258
}
12551259

12561260
symbol_idxs[reloc.target_symbol as usize] = Some(out_sym_idx);
@@ -1295,16 +1299,18 @@ pub fn split_obj(obj: &ObjInfo, module_name: Option<&str>) -> Result<Vec<ObjInfo
12951299
}
12961300

12971301
// Upgrade local symbols to global if necessary
1298-
for (obj, symbol_map) in objects.iter_mut().zip(&object_symbols) {
1299-
for (globalize_idx, new_name) in &globalize_symbols {
1300-
if let Some(symbol_idx) = symbol_map[*globalize_idx as usize] {
1301-
let mut symbol = obj.symbols[symbol_idx].clone();
1302-
symbol.name.clone_from(new_name);
1303-
if symbol.flags.is_local() {
1304-
log::debug!("Globalizing {} in {}", symbol.name, obj.name);
1305-
symbol.flags.set_scope(ObjSymbolScope::Global);
1302+
if globalize_symbols {
1303+
for (obj, symbol_map) in objects.iter_mut().zip(&object_symbols) {
1304+
for (globalize_idx, new_name) in &symbols_to_globalize {
1305+
if let Some(symbol_idx) = symbol_map[*globalize_idx as usize] {
1306+
let mut symbol = obj.symbols[symbol_idx].clone();
1307+
symbol.name.clone_from(new_name);
1308+
if symbol.flags.is_local() {
1309+
log::debug!("Globalizing {} in {}", symbol.name, obj.name);
1310+
symbol.flags.set_scope(ObjSymbolScope::Global);
1311+
}
1312+
obj.symbols.replace(symbol_idx, symbol)?;
13061313
}
1307-
obj.symbols.replace(symbol_idx, symbol)?;
13081314
}
13091315
}
13101316
}

0 commit comments

Comments
 (0)