Do not align vmsize/filesize to SEG_PAGE_SIZE every time. Move rel_offset check down due to this change.
Unified · Split
| @@ -1714,10 +1714,8 @@ static void collect_sections(TCCState *s1, struct macho *mo) · 1713 unmodified lines | ||
| 1714 | 1714 | for (sk = sk_unknown; sk < sk_last; sk++) { |
| 1715 | 1715 | struct section_64 *sec = NULL; |
| 1716 | 1716 | if (seg) { |
| 1717 | − seg->vmsize = (curaddr - seg->vmaddr + SEG_PAGE_SIZE - 1) & -SEG_PAGE_SIZE; | |
| 1718 | − seg->filesize = (fileofs - seg->fileoff + SEG_PAGE_SIZE - 1) & -SEG_PAGE_SIZE; | |
| 1719 | − curaddr = seg->vmaddr + seg->vmsize; | |
| 1720 | − fileofs = seg->fileoff + seg->filesize; | |
| 1717 | + seg->vmsize = curaddr - seg->vmaddr; | |
| 1718 | + seg->filesize = fileofs - seg->fileoff; | |
| 1721 | 1719 | } |
| 1722 | 1720 | #ifdef CONFIG_NEW_MACHO |
| 1723 | 1721 | if (sk == sk_linkedit) { |
| @@ -1961,17 +1959,6 @@ ST_FUNC void bind_rebase_import(TCCState *s1, struct macho *mo) · 237 unmodified lines | ||
| 1961 | 1959 | mo->bind_rebase[i + 1].bind ? "bind" : "rebase", |
| 1962 | 1960 | s1->sections[mo->bind_rebase[i].section]->name, name); |
| 1963 | 1961 | } |
| 1964 | − for (i = 0; i < mo->n_bind_rebase; i++) { | |
| 1965 | − addr_t r_offset = mo->bind_rebase[i].rel.r_offset; | |
| 1966 | − if ((r_offset & 3) || | |
| 1967 | − (r_offset & (SEG_PAGE_SIZE - 1)) > | |
| 1968 | − SEG_PAGE_SIZE - PTR_SIZE) { | |
| 1969 | − Section *s = s1->sections[mo->bind_rebase[i].section]; | |
| 1970 | − | |
| 1971 | − tcc_error("Illegal rel_offset %s %lld", | |
| 1972 | − s->name, (long long)r_offset); | |
| 1973 | − } | |
| 1974 | − } | |
| 1975 | 1962 | header = (struct dyld_chained_fixups_header *) data; |
| 1976 | 1963 | data += (sizeof(struct dyld_chained_fixups_header) + 7) & -8; |
| 1977 | 1964 | header->starts_offset = data - mo->chained_fixups->data; |
| @@ -2024,6 +2011,10 @@ ST_FUNC void bind_rebase_import(TCCState *s1, struct macho *mo) · 46 unmodified lines | ||
| 2024 | 2011 | addr_t r_offset = mo->bind_rebase[k].rel.r_offset; |
| 2025 | 2012 | addr_t addr = s->sh_addr + r_offset; |
| 2026 | 2013 | |
| 2014 | + if ((addr & 3) || | |
| 2015 | + (addr & (SEG_PAGE_SIZE - 1)) > SEG_PAGE_SIZE - PTR_SIZE) | |
| 2016 | + tcc_error("Illegal rel_offset %s %lld", | |
| 2017 | + s->name, (long long)r_offset); | |
| 2027 | 2018 | if (addr >= end) |
| 2028 | 2019 | break; |
| 2029 | 2020 | if (addr >= start) { |