Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Unified Diff: tests/pnacl_ld_experiments/hello1.c

Issue 10268028: Intial experiment for building dynamic images without glibc under pnacl (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tests/pnacl_ld_experiments/hello1.c
===================================================================
--- tests/pnacl_ld_experiments/hello1.c (revision 0)
+++ tests/pnacl_ld_experiments/hello1.c (revision 0)
@@ -0,0 +1,114 @@
+#include <unistd.h>
jvoung - send to chromium... 2012/05/01 23:30:49 Copyright notice.
robertm 2012/05/02 17:33:12 Done.
+#include <stdlib.h>
+
+#define NACL_INSTR_BLOCK_SHIFT 5
jvoung - send to chromium... 2012/05/01 23:30:49 Note about this experiment being tailored to x86?
Robert Muth (chromium) 2012/05/02 16:18:32 IIRC this works for all archs
+#define NACL_PAGESHIFT 12
+#define NACL_SYSCALL_START_ADDR (16 << NACL_PAGESHIFT)
+#define NACL_SYSCALL_ADDR(syscall_number) \
+ (NACL_SYSCALL_START_ADDR + (syscall_number << NACL_INSTR_BLOCK_SHIFT))
+
+#define NACL_SYSCALL(s) ((TYPE_nacl_ ## s) NACL_SYSCALL_ADDR(NACL_sys_ ## s))
+
+typedef int (*TYPE_nacl_write) (int desc, void const *buf, int count);
+typedef void (*TYPE_nacl_null) (void);
+typedef void (*TYPE_nacl_exit) (int status);
+
+#include <bits/nacl_syscalls.h>
jvoung - send to chromium... 2012/05/01 23:30:49 Does this have to be included down here, or can it
Robert Muth (chromium) 2012/05/02 16:18:32 Done.
+
+/* ====================================================================== */
jvoung - send to chromium... 2012/05/01 23:30:49 Comment about the purpose of this particular sub-e
Robert Muth (chromium) 2012/05/02 16:18:32 Done.
+extern void _dl_get_tls_static_info(int *static_tls_size,
+ int *static_tls_align);
+extern int __tls_get_addr();
+/* ====================================================================== */
+int mystrlen(const char* s) {
+ int count = 0;
+ while (*s++) ++count;
+ return count;
+}
+
+
+void myhextochar(int n, char buffer[9]) {
+ int i;
+ buffer[8] = 0;
+
+ for (i = 0; i < 8; ++i) {
+ int nibble = 0xf & (n >> (4 * (7 - i)));
+ if (nibble <= 9) {
+ buffer[i] = nibble + '0';
+ } else {
+ buffer[i] = nibble - 10 + 'A';
+ }
+ }
+}
+
+#define myprint(s) NACL_SYSCALL(write)(1, s, mystrlen(s))
+
+__thread int tdata1 = 1;
+__thread int tdata2 = 3;
+
+
+ssize_t write(int l, const void* buf, size_t n) {
jvoung - send to chromium... 2012/05/01 23:30:49 Is that parameter a "l" or a "1"? Could you name i
jvoung - send to chromium... 2012/05/02 17:20:42 Well, I do think it will be clearer, since you do
+ return NACL_SYSCALL(write)(l, buf, n);
+}
+
+void exit(int ret) {
+ NACL_SYSCALL(exit)(ret);
+}
+
+void __deregister_frame_info(const void *begin) {
+ myprint("__deregister_frame_info\n");
+}
+
+void __register_frame_info(void *begin, void *ob) {
+ myprint("__register_frame_info\n");
+}
+
+
+int main(int argc, char** argv, char** envp) {
+ myprint("hello world\n");
+ char buffer[9];
+
+ myhextochar(tdata1, buffer);
+ myprint(buffer);
jvoung - send to chromium... 2012/05/01 23:30:49 perhaps print "tdata1 (expecting 1): " first, same
robertm 2012/05/02 17:33:12 Done.
+ myprint("\n");
+
+ myhextochar(tdata2, buffer);
+ myprint(buffer);
+ myprint("\n");
+
+ int static_tls_size;
+ int static_tls_align;
+
+#if 0
+ /* will be enabled soon */
+ int x = (int) & __tls_get_addr;
+ myhextochar(x, buffer);
+ myprint(buffer);
+ myprint("\n");
+ _dl_get_tls_static_info (&static_tls_size, &static_tls_align);
+#endif
+
+ return 0;
+}
+
+char message_init[] = "init\n";
+
+int __libc_csu_init (int argc, char **argv, char **envp) {
+ write(1, message_init, sizeof(message_init));
+ return 0;
+}
+
+char message_fini[] = "fini\n";
+void __libc_csu_fini (void) {
+ write(1, message_fini, sizeof(message_fini));
+}
+
+void __libc_start_main (int (*main) (int argc, char **argv, char **envp),
+ int argc, char **argv,
+ int (*init) (int argc, char **argv, char **envp),
+ void (*fini) (void),
+ void (*rtld_fini) (void),
+ void *stack_end) {
+
+ exit(main(0, 0, 0));
+}
Property changes on: tests/pnacl_ld_experiments/hello1.c
___________________________________________________________________
Added: svn:eol-style
+ LF
« tests/pnacl_ld_experiments/fortytwo.c ('K') | « tests/pnacl_ld_experiments/fortytwo.c ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698