【问题标题】:g++ compiled binaries give “cannot execute binary file”g++ 编译的二进制文件给出“无法执行二进制文件”
【发布时间】:2016-02-07 16:41:08
【问题描述】:

我正在编写 CUDA 代码,并正在使用以下 Makefile 编译并将其链接在一起。

DEBUG = TRUE
CUDA_PATH   = /usr/local/cuda
INC_DIR     = ../include
ICC = -I/usr/include -I$(INC_DIR) -I$(CUDA_PATH)/include
LIB_CUDA    = -L$(CUDA_PATH)/lib64
NVCC    = $(CUDA_PATH)/bin/nvcc
LINT    = cppcheck
LINK    = $(NVCC)
CXX = g++

C_SOURCES   = main.c
CUDA_SOURCES    = cuda_r_lib.cu
EXE     = r_lib
OBJS        = main.o
CUDA_OBJS   = cuda_r_lib.o
HFILES      = $(INC_DIR)/r_lib.h
MAKEFILE    = Makefile
REBUILDABLES    = $(CUDA_OBJS) $(OBJS) r_lib

LFLAGS      =  -lcuda $(LIB_CUDA)

ifdef DEBUG
CFLAGS = -Wall -ggdb -pthread -fPIC -O3
CDEFINES = $(ICC)
CUDA_FLAGS = -arch=sm_20 $(ICC)
else
CFLAGS = -Wall -pthread -fPIC -O3
CDEFINES = $(ICC) -DNDEBUG=1
CUDA_FLAGS = -arch=sm_20 $(ICC)
endif

$(EXE): $(OBJS) $(CUDA_OBJS)
    $(LINK) $(LFLAGS) $(OBJS) $(CUDA_OBJS) -o $(EXE)

$(OBJS): $(C_SOURCES) $(HFILES) $(MAKEFILE)
    $(CXX) $(CDEFINES) $(CFLAGS) -c $(C_SOURCES) -o $@
$(CUDA_OBJS): $(CUDA_SOURCES) $(HFILES) $(MAKEFILE)
    $(NVCC) $(CUDA_FLAGS) -c $(CUDA_SOURCES) -o $@

clean:
    rm -f *~ $(REBUILDABLES) *ii core
lint:
    $(LINT) --enable=all --inconclusive --std=posix *.c *.cu

我已经到了可以干净地编译和链接代码的地步。但是二进制 ./r_lib 不执行。我什至不能改变它的权限(试过 chmod +x ...)

这是我得到的:

rinka@rinka-Desktop:/media/rinka/CUDA/dev/code$ make
g++ -I/usr/include -I../include -I/usr/local/cuda/include -Wall -ggdb -pthread -fPIC -O3 -c main.c -o main.o
/usr/local/cuda/bin/nvcc -arch=sm_20 -I/usr/include -I../include -I/usr/local/cuda/include -c cuda_r_lib.cu -o cuda_r_lib.o
/usr/local/cuda/bin/nvcc -lcuda -L/usr/local/cuda/lib64 main.o cuda_r_lib.o -o r_lib
rinka@rinka-Desktop:/media/rinka/CUDA/dev/code$ ll ./r_lib
-rw------- 1 rinka rinka 552223 Nov  6 19:08 ./r_lib
rinka@rinka-Desktop:/media/rinka/CUDA/dev/code$ file r_lib
r_lib: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=8f2b88bf570a5d74c2c237969a93519f64636b86, not stripped
rinka@rinka-Desktop:/media/rinka/CUDA/dev/code$ ./r_lib
bash: ./r_lib: Permission denied
rinka@rinka-Desktop:/media/rinka/CUDA/dev/code$ chmod +x ./r_lib
rinka@rinka-Desktop:/media/rinka/CUDA/dev/code$ ./r_lib
bash: ./r_lib: Permission denied
rinka@rinka-Desktop:/media/rinka/CUDA/dev/code$ ll ./r_lib
-rw------- 1 rinka rinka 552223 Nov  6 19:08 ./r_lib

我终其一生都无法弄清楚自己做错了什么——也许我只是累了。我看了看:gcc compiled binaries give "cannot execute binary file" 但我在链接时没有使用 -c 选项...

另外 - 任何关于 nvcc 的编译器和链接器选项的反馈都将有助于更严格地发出警告,我们将非常欢迎。到目前为止,我对收到的警告并不满意。

【问题讨论】:

  • 您使用g++ 处理.c 文件?
  • 这是另一个问题。不要对 C 代码使用 C++ 编译器(反之亦然)。这是两种不同的语言。如果您编写 C++ cpde,请使用标准名称后缀,例如.cpp.

标签: c cuda g++ nvcc


【解决方案1】:

这不是来自您的编译器或构建工具的消息,而是来自您的 shell 并且源自操作系统。

对于路径 /media/,您的文件似乎在外部存储上,例如USB记忆棒。这可能使用选项noexec 安装,因此您无法从那里执行。此外,如果那是 VFAT,则其中没有权限标志,因此您无法设置它们。相反,操作系统使用默认标志,并且还可能阻止从该分区执行程序。这是针对恶意软件的安全措施。

试试mount 并检查选项。

如果我是对的,您应该将文件移动到普通文件系统,例如你的家。

【讨论】:

  • (感觉很蠢)。是的,你是对的奥拉夫,我在不同的(VFAT)分区上有这个。现在已经编译好了。谢谢。
  • @RinkaSingh:如果这解决了您的问题,您可能会接受答案并可能投票。这是堆栈溢出时说“谢谢”的方式。
  • 我已经做了@Olaf。看起来我的赞成票在我达到 15 分之前不算数。好的。我没有接受答案。我现在已经做到了。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
相关资源
最近更新 更多