linux运行c程序 权限不够,linux – 使用glibc而不是默认库编译的C程序:执行时拒绝权限...

这是我关于stackoverflow的第一个问题,所以我会尽力做好.

语境:

我想提供一个可以在每个Linux发行版上运行的程序(例如,一个将使用C 11的程序,在没有C 11库的系统上运行).

为此,我想复制我的程序使用的所有库,并将它们放在带有可执行文件的文件夹中,这样它就可以使用这些库而不是系统库.

我有2个环境要测试:

– Opensuse,(GNU libc)2.19

– Ubuntu,(Ubuntu EGLIBC 2.17-Oubuntu5.1)2.17

我在Opensuse下编译我的程序,并在Ubuntu下运行它.该程序使用默认库时效果很好.

项目:

这是main.c:

int main(int ac,char **av) {

printf("Hello World !\n");

}

这是我在Opensuse下的文件夹的树(在没有main.c et exec.sh的Ubuntu下相同):

+ project

|

+--- main.c

+--- a.out

+--- exec.sh

+---+ lib

|

+--- libc.so.6

+--- ld-linux-x86-64.so.2

最后,当我使用简单的编译启动程序时,这里是ldd和readelf:

> gcc main.c -o a.out

> ldd ./a.out

linux-vdso.so.1 (0x00007fff85f57000)

libc.so.6 => /lib64/libc.so.6 (0x00007f1fdaaaf000)

/lib64/ld-linux-x86-64.so.2 (0x00007f1dae75000)

> readelf -d a.out | grep "library\|Library"

0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

我做了一些研究,最后找到了this post,他们解释了一下ld-linux.so.

这是我用来编译的脚本:

#!/bin/bash

dir=`pwd`

execName="a.out"

libDir="/lib"

linker="ld-linux-x86-64.so.2"

gcc main.c -o ${execName} -Wl,--rpath=${dir}${libDir} -Wl,--dynamic-linker=${dir}${libDir}/${linker}

当我在我的Opensuse上使用脚本启动我的a.out编译时,我得到了以下内容:

> ./a.out

Hello World !

> ldd ./a.out

linux-vdso.so.1 (0x00007f3222e27000)

libc.so.6 => /path/to/project/lib/libc.so.6 (0x00007f3222a7e000)

/path/to/project/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x000073222e2b000)

> readelf -d a.out | grep "library\|Library"

0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

0x000000000000001d (RUNPATH) Library runpath: [/path/to/project/lib]

问题:

现在,当我在我的Ubuntu上启动此可执行文件a.out(在Opensuse下编译)时,我得到以下输出:

> ./a.out

./a.out: Permission denied.

> ldd ./a.out

linux-vdso.so.1 (0x00007fff5b5fe000)

libc.so.6 => /path/to/project/lib/libc.so.6 (0x00007f47df480000)

/path/to/project/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f47df82a000)

> readelf -d a.out | grep "library\|Library"

0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

0x000000000000001d (RUNPATH) Library runpath: [/path/to/project/lib]

当我启动可执行文件时,我一直拒绝此权限,我不知道为什么.

我使用Filezilla将我的a.out和我的lib文件夹从Opensuse传输到Ubuntu,并且a.out在传输之后不是可执行文件,所以我需要这样做:

chmod 755 a.out

我在Opensuse和Ubuntu下拥有相同的树

lib文件夹中的2个库是Opensuse的默认库

任何关于许可被拒绝的帮助,或者其他方式来做我想要的将是受欢迎的.

在此先感谢您的帮助!

注意:我不能使用LD_PRELOAD,因为你需要root才能使用它,它不能用于我想做的事情.

另外我想避免静态编译,但如果它是我将考虑的唯一解决方案

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值