summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpommicket <pommicket@gmail.com>2022-11-08 17:46:10 -0500
committerpommicket <pommicket@gmail.com>2022-11-08 17:46:10 -0500
commit4d857664141a219bd06ed3cf8fb1816eac4d74a7 (patch)
treecd8378cd7160d010e18b90b8920cab8115b4093d
parentcace49fd579f8838969504bf3f684f2f50ecc932 (diff)
emit warning on position-independent object file
-rw-r--r--src/linker.rs15
-rw-r--r--src/main.rs1
-rw-r--r--test.c4
3 files changed, 14 insertions, 6 deletions
diff --git a/src/linker.rs b/src/linker.rs
index 26e306b..fdc1f5b 100644
--- a/src/linker.rs
+++ b/src/linker.rs
@@ -120,18 +120,21 @@ pub enum LinkWarning {
/// unsupported relocation type
RelUnsupported(u8),
/// relocation is too large
- RelOOB(String, u64),
+ RelOob(String, u64),
/// multiple definitions of a symbol
MultipleDefinitions(String),
+ /// looks like a position-independent file.
+ MaybePic(String),
}
impl fmt::Display for LinkWarning {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use LinkWarning::*;
match self {
- RelOOB(source, offset) => write!(f, "relocation {source}+0x{offset:x} goes outside of its section (it will be ignored)."),
+ RelOob(source, offset) => write!(f, "relocation {source}+0x{offset:x} goes outside of its section (it will be ignored)."),
RelUnsupported(x) => write!(f, "Unsupported relocation type {x} (relocation ignored)."),
MultipleDefinitions(name) => write!(f, "Symbol {name} has multiple definitions. One of them will be chosen arbitrarily."),
+ MaybePic(name) => write!(f, "{name} looks like a position-independent object. Try recompiling with -fno-pic?"),
}
}
}
@@ -956,6 +959,10 @@ impl<'a> Linker<'a> {
symbol: &elf::Symbol,
) -> ObjectResult<()> {
let name = elf.symbol_name(symbol)?;
+ if name == "_GLOBAL_OFFSET_TABLE_" {
+ self.emit_warning(LinkWarning::MaybePic(self.source_name(source).into()));
+ }
+
let name_id = self.symbol_names.add(name);
let size = symbol.size;
@@ -1005,6 +1012,7 @@ impl<'a> Linker<'a> {
use ObjectError::*;
let source_id = SourceId(self.sources.len() as _);
+ self.sources.push(name.into());
let elf = elf::Reader32LE::new(reader)?;
if elf.r#type() != elf::Type::Rel {
@@ -1033,7 +1041,6 @@ impl<'a> Linker<'a> {
}
self.relocations.push(relocations);
- self.sources.push(name.into());
self.source_data.push(elf.to_data());
Ok(())
@@ -1162,7 +1169,7 @@ impl<'a> Linker<'a> {
/// Apply relocation to executable.
fn apply_relocation(&self, exec: &mut LinkerOutput, map: &OffsetMap, rel: &Relocation) {
let warn_oob = || {
- self.emit_warning(LinkWarning::RelOOB(
+ self.emit_warning(LinkWarning::RelOob(
self.source_name(rel.r#where.0).into(),
rel.r#where.1,
));
diff --git a/src/main.rs b/src/main.rs
index f0a3725..585d241 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,5 @@
/*
@TODO:
-- generate a warning/error on position-independent object files
- static libraries
*/
diff --git a/test.c b/test.c
index 86453de..31dee49 100644
--- a/test.c
+++ b/test.c
@@ -2,6 +2,8 @@
#include <stdlib.h>
+int f() { return 13; }
+
void entry(void) {
- exit(42);
+ exit(f());
}