Skip to content

Commit 15057a3

Browse files
committed
wip
1 parent 3bde421 commit 15057a3

File tree

12 files changed

+186
-86
lines changed

12 files changed

+186
-86
lines changed

packages/std/autotools/perl.tg.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export const build = async (arg?: tg.Unresolved<Arg>) => {
7777
});
7878

7979
const unwrappedPerl = tg.File.expect(await perlArtifact.get("bin/perl"));
80-
80+
8181
const wrappedPerl = await std.wrap(unwrappedPerl, {
8282
buildToolchain: env,
8383
env: {

packages/std/packages/ld_proxy/src/main.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ async fn create_wrapper(options: &Options) -> tg::Result<()> {
259259
interpreter,
260260
name,
261261
needed_libraries: initial_needed_libraries,
262+
entrypoint,
262263
} = analyze_output_file(&options.output_path).await?;
263264
tracing::debug!(?is_executable, ?interpreter, ?initial_needed_libraries);
264265

@@ -446,12 +447,15 @@ async fn create_wrapper(options: &Options) -> tg::Result<()> {
446447
let output_artifact_id = output_file.id().clone().into();
447448

448449
// Create the manifest.
449-
let manifest =
450+
let mut manifest =
450451
create_manifest(output_artifact_id, options, interpreter, library_paths).await?;
451452
tracing::trace!(?manifest);
452453

453454
// If requested, emebd the wrapper.
454455
let new_wrapper = if options.embed {
456+
if let Some(entrypoint) = entrypoint {
457+
manifest.executable = tangram_std::manifest::Executable::Address(entrypoint);
458+
}
455459
manifest.embed(&tg, &output_file).await?
456460
} else {
457461
manifest.write(&tg).await?
@@ -736,6 +740,8 @@ struct AnalyzeOutputFileOutput {
736740
name: Option<String>,
737741
/// Does the output file specify libraries required at runtime?
738742
needed_libraries: Vec<String>,
743+
/// The entrypoint of the executable.
744+
entrypoint: Option<u64>,
739745
}
740746

741747
/// The possible interpreter requirements of an output file.
@@ -1262,6 +1268,7 @@ fn analyze_executable(bytes: &[u8]) -> tg::Result<AnalyzeOutputFileOutput> {
12621268
interpreter: InterpreterRequirement::None,
12631269
name: None,
12641270
needed_libraries: vec![],
1271+
entrypoint: None,
12651272
},
12661273

12671274
// Handle an ELF file.
@@ -1282,12 +1289,14 @@ fn analyze_executable(bytes: &[u8]) -> tg::Result<AnalyzeOutputFileOutput> {
12821289
.map(std::string::ToString::to_string)
12831290
.collect_vec();
12841291

1292+
let entrypoint = (elf.entry != 0).then_some(elf.entry);
1293+
12851294
// Check whether or not the object requires an interpreter:
12861295
// - If the object has an interpreter field.
12871296
// - If the object is a PIE and has 1 or more NEEDS.
12881297
let interpreter =
12891298
if elf.interpreter.is_some() || (is_pie && !needed_libraries.is_empty()) {
1290-
let interpreter = elf.interpreter.unwrap();
1299+
let interpreter = elf.interpreter.ok_or_else(|| tg::error!("missing interpreter in ELF"))?;
12911300
if interpreter.starts_with("/lib") {
12921301
if interpreter.contains("musl") {
12931302
InterpreterRequirement::Default(InterpreterFlavor::Musl)
@@ -1307,6 +1316,7 @@ fn analyze_executable(bytes: &[u8]) -> tg::Result<AnalyzeOutputFileOutput> {
13071316
interpreter,
13081317
name,
13091318
needed_libraries,
1319+
entrypoint,
13101320
}
13111321
},
13121322

@@ -1321,12 +1331,13 @@ fn analyze_executable(bytes: &[u8]) -> tg::Result<AnalyzeOutputFileOutput> {
13211331
.map(extract_filename)
13221332
.filter(|file_name| name.as_ref().is_none_or(|n| n != file_name))
13231333
.collect_vec();
1324-
1334+
let entrypoint = mach.entry;
13251335
AnalyzeOutputFileOutput {
13261336
is_executable,
13271337
interpreter: InterpreterRequirement::Default(InterpreterFlavor::Dyld),
13281338
name,
13291339
needed_libraries,
1340+
entrypoint: Some(entrypoint)
13301341
}
13311342
},
13321343
goblin::mach::Mach::Fat(mach) => {
@@ -1353,6 +1364,7 @@ fn analyze_executable(bytes: &[u8]) -> tg::Result<AnalyzeOutputFileOutput> {
13531364
interpreter: InterpreterRequirement::Default(InterpreterFlavor::Dyld),
13541365
name,
13551366
needed_libraries,
1367+
entrypoint: None
13561368
}
13571369
},
13581370
},

packages/std/packages/std/manifest.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,11 @@ impl Manifest {
316316

317317
// Create a temp file for the manifest.
318318
let mut manifest = tempfile::NamedTempFile::new().map_err(|source| tg::error!(!source, "failed to get temp file"))?;
319-
let output = "/tmp/__wrap_output__";
319+
320+
// Create a random output name.
321+
let tempfile = tempfile::NamedTempFile::new()
322+
.map_err(|source| tg::error!(!source, "failed to create temp file"))?;
323+
let output = tempfile.path();
320324

321325
// Create the manifest file. TODO: asyncify.
322326
let contents = serde_json::to_vec(self)

packages/std/packages/stub/include/manifest.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,12 @@ static String render_ld_preload (Arena* arena, Manifest* manifest) {
176176

177177
static void print_manifest (Manifest* manifest) {
178178
if (manifest->executable.ptr) {
179-
trace("executable: %s\n", manifest->executable);
179+
trace("executable: ");
180+
print_json_string(&manifest->executable);
181+
trace("\n");
180182
}
181183
if (manifest->entrypoint) {
182-
trace("entrypoint: %s\n", manifest->entrypoint);
184+
trace("entrypoint: %d\n", manifest->entrypoint);
183185
}
184186
trace("interpreter: %s\n", manifest->interpreter.ptr);
185187
trace("libary_paths:\n");

packages/std/packages/stub/include/table.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,18 @@ static int insert (
7777
while(node) {
7878
// If this is an empty node, use it.
7979
if (node->key.ptr == 0) {
80-
node->key = key;
81-
node->val = val;
80+
node->key.ptr = key.ptr;
81+
node->key.len = key.len;
82+
node->val.ptr = val.ptr;
83+
node->val.len = val.len;
8284
table->size++;
8385
return 0;
8486
}
8587

8688
// If this has the same key, overwrite its value.
8789
if (streq(node->key, key)) {
88-
node->val = val;
90+
node->val.ptr = val.ptr;
91+
node->val.len = val.len;
8992
return 0;
9093
}
9194
node = node->next;
@@ -96,8 +99,10 @@ static int insert (
9699
if (!new_node) {
97100
return -1;
98101
}
99-
new_node->key = key;
100-
new_node->val = val;
102+
new_node->key.ptr = key.ptr;
103+
new_node->key.len = key.len;
104+
new_node->val.ptr = val.ptr;
105+
new_node->val.len = val.len;
101106
new_node->next = NULL;
102107
node->next = new_node;
103108
table->size++;

packages/std/packages/stub/include/util.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ static bool cstarts_with (String a, const char* prefix) {
134134
}
135135

136136
static String join (Arena* arena, String separator, String* strings, size_t nstrings) {
137+
// Compute the max length of the string.
137138
size_t len = 0;
138139
for (size_t n = 0; n < nstrings; n++) {
139140
len += strings[n].len;
@@ -142,9 +143,11 @@ static String join (Arena* arena, String separator, String* strings, size_t nstr
142143
}
143144
}
144145

146+
// Allocate the new string.
145147
String out = {0};
146148
out.ptr = ALLOC_N(arena, len + 1, uint8_t);
147149

150+
// Append new strings to it.
148151
for (size_t n = 0; n < nstrings; n++) {
149152
if (strings[n].ptr) {
150153
memcpy(out.ptr + out.len, strings[n].ptr, strings[n].len);

0 commit comments

Comments
 (0)