summaryrefslogtreecommitdiff
path: root/addr2line.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-09 11:19:23 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-09 11:19:23 +0000
commit9d2f88fc13160b677e1af880d83aef8de4a4e237 (patch)
treedb92aaa21d0822e2446972c42ef1ef04f9ab6766 /addr2line.c
parent1922253e2e855f6ea01ddcd53b29400800fb1eeb (diff)
downloadbundler-9d2f88fc13160b677e1af880d83aef8de4a4e237.tar.gz
addr2line.c: fix compilation for i386-darwin
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65644 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'addr2line.c')
-rw-r--r--addr2line.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/addr2line.c b/addr2line.c
index 2670555493..485e9f6dc5 100644
--- a/addr2line.c
+++ b/addr2line.c
@@ -1821,11 +1821,16 @@ static uintptr_t
fill_lines(int num_traces, void **traces, int check_debuglink,
obj_info_t **objp, line_info_t *lines, int offset)
{
+# ifdef __LP64__
+# define LP(x) x##_64
+# else
+# define LP(x) x
+# endif
int fd;
off_t filesize;
char *file, *p;
obj_info_t *obj = *objp;
- struct mach_header_64 *header;
+ struct LP(mach_header) *header;
uintptr_t dladdr_fbase = 0;
{
@@ -1883,19 +1888,25 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
obj->mapped = file;
obj->mapped_size = (size_t)filesize;
- header = (struct mach_header_64 *)file;
- if (header->magic != MH_MAGIC_64) {
+ header = (struct LP(mach_header) *)file;
+ if (header->magic != LP(MH_MAGIC)) {
/* TODO: universal binaries */
- kprintf("'%s' is not a 64-bit Mach-O file!\n",binary_filename);
+ kprintf("'%s' is not a "
+# ifdef __LP64__
+ "64"
+# else
+ "32"
+# endif
+ "-bit Mach-O file!\n",binary_filename);
close(fd);
goto fail;
}
- p = file + sizeof(struct mach_header_64);
+ p = file + sizeof(*header);
for (uint32_t i = 0; i < (uint32_t)header->ncmds; i++) {
struct load_command *lcmd = (struct load_command *)p;
switch (lcmd->cmd) {
- case LC_SEGMENT_64:
+ case LP(LC_SEGMENT):
{
static const char *debug_section_names[] = {
"__debug_abbrev",
@@ -1904,15 +1915,15 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
"__debug_ranges",
"__debug_str"
};
- struct segment_command_64 *scmd = (struct segment_command_64 *)lcmd;
+ struct LP(segment_command) *scmd = (struct LP(segment_command) *)lcmd;
if (strcmp(scmd->segname, "__TEXT") == 0) {
obj->vmaddr = scmd->vmaddr;
}
else if (strcmp(scmd->segname, "__DWARF") == 0) {
- p += sizeof(struct segment_command_64);
+ p += sizeof(struct LP(segment_command));
for (uint64_t i = 0; i < scmd->nsects; i++) {
- struct section_64 *sect = (struct section_64 *)p;
- p += sizeof(struct section_64);
+ struct LP(section) *sect = (struct LP(section) *)p;
+ p += sizeof(struct LP(section));
for (int j=0; j < DWARF_SECTION_COUNT; j++) {
struct dwarf_section *s = obj_dwarf_section_at(obj, j);
@@ -1935,14 +1946,14 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
case LC_SYMTAB:
{
struct symtab_command *cmd = (struct symtab_command *)lcmd;
- struct nlist_64 *nl = (struct nlist_64 *)(file + cmd->symoff);
+ struct LP(nlist) *nl = (struct LP(nlist) *)(file + cmd->symoff);
char *strtab = file + cmd->stroff, *sname;
uint32_t j;
uintptr_t saddr;
/* kprintf("[%2d]: %x/symtab %p\n", i, cmd->cmd, p); */
for (j = 0; j < cmd->nsyms; j++) {
uintptr_t symsize, d;
- struct nlist_64 *e = &nl[j];
+ struct LP(nlist) *e = &nl[j];
if (e->n_type != N_FUN) continue;
if (e->n_sect) {
saddr = (uintptr_t)e->n_value + obj->base_addr - obj->vmaddr;