macos: Fix memtest
* free allocated memory * fix weak symbols related to -run * remove memtest from ignored tests for OSX
This commit is contained in:
		
							parent
							
								
									ac86fb50cd
								
							
						
					
					
						commit
						d174af08f9
					
				
					 2 changed files with 15 additions and 7 deletions
				
			
		
							
								
								
									
										20
									
								
								tccmacho.c
									
										
									
									
									
								
							
							
						
						
									
										20
									
								
								tccmacho.c
									
										
									
									
									
								
							| 
						 | 
					@ -212,6 +212,9 @@ struct nlist_64 {
 | 
				
			||||||
#define N_EXT   0x1
 | 
					#define N_EXT   0x1
 | 
				
			||||||
#define N_SECT  0xe
 | 
					#define N_SECT  0xe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define N_WEAK_REF      0x0040
 | 
				
			||||||
 | 
					#define N_WEAK_DEF      0x0080
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct macho {
 | 
					struct macho {
 | 
				
			||||||
    struct mach_header_64 mh;
 | 
					    struct mach_header_64 mh;
 | 
				
			||||||
    int seg2lc[4], nseg;
 | 
					    int seg2lc[4], nseg;
 | 
				
			||||||
| 
						 | 
					@ -383,9 +386,8 @@ static int check_symbols(TCCState *s1, struct macho *mo)
 | 
				
			||||||
        } else if (sym->st_shndx == SHN_UNDEF) {
 | 
					        } else if (sym->st_shndx == SHN_UNDEF) {
 | 
				
			||||||
            if (mo->iundef == -1)
 | 
					            if (mo->iundef == -1)
 | 
				
			||||||
              mo->iundef = sym_index - 1;
 | 
					              mo->iundef = sym_index - 1;
 | 
				
			||||||
            if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK)
 | 
					            if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK
 | 
				
			||||||
                continue;
 | 
					                || find_elf_sym(s1->dynsymtab_section, name)) {
 | 
				
			||||||
            if (find_elf_sym(s1->dynsymtab_section, name)) {
 | 
					 | 
				
			||||||
                /* Mark the symbol as coming from a dylib so that
 | 
					                /* Mark the symbol as coming from a dylib so that
 | 
				
			||||||
                   relocate_syms doesn't complain.  Normally bind_exe_dynsyms
 | 
					                   relocate_syms doesn't complain.  Normally bind_exe_dynsyms
 | 
				
			||||||
                   would do this check, and place the symbol into dynsym
 | 
					                   would do this check, and place the symbol into dynsym
 | 
				
			||||||
| 
						 | 
					@ -421,7 +423,7 @@ static void convert_symbol(TCCState *s1, struct macho *mo, struct nlist_64 *pn)
 | 
				
			||||||
                  ELFW(ST_TYPE)(sym->st_info), name);
 | 
					                  ELFW(ST_TYPE)(sym->st_info), name);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (sym->st_shndx == SHN_UNDEF)
 | 
					    if (sym->st_shndx == SHN_UNDEF)
 | 
				
			||||||
      tcc_error("should have been rewritten to SHN_FROMDLL");
 | 
					      tcc_error("should have been rewritten to SHN_FROMDLL: %s", name);
 | 
				
			||||||
    else if (sym->st_shndx == SHN_FROMDLL)
 | 
					    else if (sym->st_shndx == SHN_FROMDLL)
 | 
				
			||||||
      n.n_type = N_UNDF, n.n_sect = 0;
 | 
					      n.n_type = N_UNDF, n.n_sect = 0;
 | 
				
			||||||
    else if (sym->st_shndx == SHN_ABS)
 | 
					    else if (sym->st_shndx == SHN_ABS)
 | 
				
			||||||
| 
						 | 
					@ -436,7 +438,7 @@ static void convert_symbol(TCCState *s1, struct macho *mo, struct nlist_64 *pn)
 | 
				
			||||||
    if (ELFW(ST_BIND)(sym->st_info) == STB_GLOBAL)
 | 
					    if (ELFW(ST_BIND)(sym->st_info) == STB_GLOBAL)
 | 
				
			||||||
      n.n_type |=  N_EXT;
 | 
					      n.n_type |=  N_EXT;
 | 
				
			||||||
    else if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK)
 | 
					    else if (ELFW(ST_BIND)(sym->st_info) == STB_WEAK)
 | 
				
			||||||
      tcc_error("weak symbol %s unhandled", name);
 | 
					      n.n_desc |= N_WEAK_REF | (n.n_type != N_UNDF ? N_WEAK_DEF : 0);
 | 
				
			||||||
    n.n_strx = pn->n_strx;
 | 
					    n.n_strx = pn->n_strx;
 | 
				
			||||||
    n.n_value = sym->st_value;
 | 
					    n.n_value = sym->st_value;
 | 
				
			||||||
    *pn = n;
 | 
					    *pn = n;
 | 
				
			||||||
| 
						 | 
					@ -762,7 +764,7 @@ ST_FUNC int macho_output_file(TCCState *s1, const char *filename)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int fd, mode, file_type;
 | 
					    int fd, mode, file_type;
 | 
				
			||||||
    FILE *fp;
 | 
					    FILE *fp;
 | 
				
			||||||
    int ret = -1;
 | 
					    int i, ret = -1;
 | 
				
			||||||
    struct macho mo = {};
 | 
					    struct macho mo = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    file_type = s1->output_type;
 | 
					    file_type = s1->output_type;
 | 
				
			||||||
| 
						 | 
					@ -807,6 +809,12 @@ ST_FUNC int macho_output_file(TCCState *s1, const char *filename)
 | 
				
			||||||
    ret = 0;
 | 
					    ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 do_ret:
 | 
					 do_ret:
 | 
				
			||||||
 | 
					    for (i = 0; i < mo.nlc; i++)
 | 
				
			||||||
 | 
					      tcc_free(mo.lc[i]);
 | 
				
			||||||
 | 
					    tcc_free(mo.lc);
 | 
				
			||||||
 | 
					    tcc_free(mo.elfsectomacho);
 | 
				
			||||||
 | 
					    tcc_free(mo.e2msym);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fclose(fp);
 | 
					    fclose(fp);
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,7 +46,7 @@ ifeq ($(ARCH),riscv64)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
ifdef CONFIG_OSX # some don't work yet
 | 
					ifdef CONFIG_OSX # some don't work yet
 | 
				
			||||||
 TESTS := $(filter-out memtest dlltest, $(TESTS))
 | 
					 TESTS := $(filter-out dlltest, $(TESTS))
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
ifeq (,$(filter arm64 i386 x86_64,$(ARCH)))
 | 
					ifeq (,$(filter arm64 i386 x86_64,$(ARCH)))
 | 
				
			||||||
 TESTS := $(filter-out vla_test-run,$(TESTS))
 | 
					 TESTS := $(filter-out vla_test-run,$(TESTS))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue