Porting source to linux

Porting source to linux

In general, Unix programs need very little porting. Simply follow the installation instructions. If you don’t know—and don’t know how to find out—the answers to some of the questions asked during the installation procedure, you can guess, but this tends to produce buggy programs. In this case, you’re probably better off asking someone else to do the port.

If you have a BSD-ish program, you should try using -I/usr/include/bsd and -lbsd on the appropriate parts of the compilation lines.

5.2 What is ld.so and where do I get it?

ld.so is the dynamic library loader. Each binary using shared libraries used to have about 3K of start-up code to find and load the shared libraries. Now that code has been put in a special shared library, /lib/ld.so , where all binaries can look for it, so that it wastes less disk space, and can be upgraded more easily.

ld.so can be obtained from tsx-11.mit.edu/pub/linux/packages/GCC and mirror sites. The latest version at the time of writing is ld.so.1.9.5.tar.gz .

/lib/ld-linux.so.1 is the same thing for ELF «( What’s all this about ELF? )» and comes in the same package as the a.out loader.

5.3 Has anyone ported / compiled / written XXX for Linux?

First, look in the Linux Software Map—it’s at sunsite.unc.edu/pub/Linux/docs/linux-software-map, and on the other FTP sites. A search engine is available on the World Wide Web at http://www.boutell.com/lsm/ .

Check the FTP sites « Where can I get Linux material by FTP? » first—search the ls-lR or INDEX files for appropriate strings.

There’s a search engine for Linux FTP archives at http://lfw.linuxhq.com/

Also check out the Freshmeat Web site http://www.freshmeat.org , which is really cool.

If you don’t find anything, you could either download the sources to the program yourself and compile them. See « How do I port XXX to Linux? » If it’s a large package which may require some porting, post a message to comp.os.linux.development.apps .

If you compile a large-ish program, please upload it to one or more of the FTP sites, and post a message to comp.os.linux.announce (submit your posting to linux-announce@news.ornl.gov).

If you’re looking for an application program, the chances are that someone has already written a free verson. The comp.sources.wanted FAQ has instructions for finding the source code.

5.4 Can I use code or a compiler compiled for a 486 on my 386?

Yes, unless it’s the kernel.

The -m486 option to GCC, which is used to compile binaries for x486 machines, merely changes certain optimizations. This makes for slightly larger binaries which run somewhat faster on a 486. They still work fine on a 386, though, with a small performance hit.

However, from version 1.3.35 the kernel will use 486- or Pentium-specific instructions if configured for a 486 or Pentium, thus making it unusable on a 386.

GCC can be configured for a 386 or 486; the only difference is that configuring it for a 386 makes -m386 the default and configuring for a 486 makes -m486 the default; in either case these can be overriden on a per-compilation basis or by editing /usr/lib/gcc-lib/i*-linux/n.n.n/specs.

There is an Alpha version of GCC which knows how to do optimisation well for the 586, but it is quite unreliable, especially at high optimisation settings. The Pentium GCC can be found on tsx-11.mit.edu in /pub/linux/ALPHA/pentium-gcc. I’d recommend using the ordinary 486 GCC instead; word has it that using -m386 produces code that’s better for the Pentium, or at least slightly smaller.

5.5 What does gcc -O6 do?

Currently the same as -O2 (GCC 2.5) or -O3 (GCC 2.6, 2.7); any number greater than that currently does the same thing. The Makefiles of newer kernels use -O2, and you should probably do the same.

Читайте также:  Как сделать windows boot manager

5.6 Where are linux/*.h and asm/*.h?

These are in the directories /usr/include/linux and /usr/include/asm . However, they should be symbolic links to your kernel sources in /usr/src/linux , not actual directories.

If you don’t have the kernel sources, download them—see, « How do I upgrade/recompile my kernel? »

Then, use rm to remove any garbage, and ln to create the links: /usr/src/linux/include/asm is a symbolic link to an architecture-specific asm-arch directory—if you have a freshly unpacked kernel source tree you must use make symlinks. You’ll also find that you may need to do make config in a newly-unpacked kernel source tree, to create linux/autoconf.h.

5.7 I get errors when I try to compile the kernel.

See the previous question regarding the header files.

Remember that when you apply a patch to the kernel, you must use the -p0 or -p1 option: otherwise the patch may be misapplied. See the patch manual page for details.

ld: unrecognised option `-qmagic’ means that you should get a newer linker, from ftp://tsx-11.mit.edu/pub/linux/packages/GCC/, in the file binutils-2.8.1.0.1.bin.tar.gz .

5.8 How do I make a shared library?

For ELF, For a.out , get tools-n.nn.tar.gz from tsx-11.mit.edu, in /pub/linux/packages/GCC/src/. It comes with documentation that will tell you what to do. Note that a.out shared libraries are a very tricky business. Consider upgrading your libraries to ELF shared libraries. See the ELF HOWTO, at sunsite.unc.edu/pub/Linux/docs/HOWTO/

5.9 My executables are (very) large.

With an ELF compiler (see Q8.2 `What’s all this about ELF ?’) the most common cause of large executables is the lack of an appropriate .so library link for one of the libraries you’re using. There should be a link like libc.so for every library like libc.so.5.2.18.

With an a.out compiler (see, « What’s all this about ELF? ») the most common cause of large executables is the -g linker (compiler) flag. This produces (as well as debugging information in the output file) a program which is statically linked, i.e. one which includes a copy of the C library instead of using a dynamically linked copy.

Other things worth investigating are -O and -O2 which enable optimisation (check the GCC documentation) and -s (or the strip command) which strip the symbol information from the resulting binary (making debugging totally impossible).

You may wish to use -N on very small executables (less than 8K with the -N ), but you shouldn’t do this unless you understand its performance implications, and definitely never with daemons.

5.10 Does Linux support threads or lightweight processes?

As well as the Unix multiprocessing model involving heavyweight processes, which is of course part of the standard Linux kernel, there are several implementations of lightweight processes or threads, most of which are generic packages for any Unix:

  • In sipb.mit.edu:/pub/pthread or ftp.ibp.fr:/pub/unix/threads/pthreads. Documentation isn’t in the package, but is available on the World Wide Web at http://www.mit.edu:8001/people/proven/home_page.html. Newer Linux libcs contain the pthreads source; the GNU Ada compiler on sunsite.unc.edu in /pub/Linux/devel/lang/ada/gnat-3.01-linux+elf.tar.gz contains binaries made from that source code.
  • In ftp.cs.washington.edu:/pub/qt-001.tar.Z is QuickThreads. More information can be found in the technical report, available on the same site as /tr/1993/05/UW-CSE-93-05-06.PS.Z.
  • In gummo.doc.ic.ac.uk:/rex is lwp, a very minimal implementation.
  • In ftp.cs.fsu.edu:/pub/PART, an Ada implementation. This is useful mainly because it has a lot of PostScript papers that you’ll find useful in learning more about threads. This is not directly usable under Linux.

Please contact the authors of the packages in question for details.

5.11 Where can I get `lint’ for Linux?

Roughly equivalent functionality is built into the GNU C compiler (gcc) which is used by Linux systems. Use the -Wall option to turn on most of the useful extra warnings. Check the GCC manual for more details (type control-h followed by i in Emacs and select the entry for GCC).

Источник

Кунг-фу стиля Linux: разбираемся с последовательными портами

Раньше последовательные порты были буквально повсюду. И они, в каком-то смысле, никуда и не делись, так как многое, что подключается к компьютеру по USB, на самом деле, выглядит для системы как последовательный порт. Проблема тут заключается в том, что в наши дни всё в мире завязано на компьютерные сети. Конечно, можно купить терминальный сервер, который преобразует последовательный порт в интерфейс Ethernet. Но это совсем не интересно. Здесь я хочу рассказать о том, как пробрасывать последовательные порты по сети с использованием существующих Linux-инструментов. Решение это не идеальное, оно оказывается работоспособным далеко не всегда, но если оно работает, то работает оно хорошо.

Читайте также:  Как собрать свою сборку windows

Всё — это файл — до тех пор, пока это не так

Когда-то в прошлом ОС Unix — прародитель Linux — практически всё считала файлом. Все файлы были созданы более или менее равными. Программы не заботило то, с чем именно им приходилось работать: с локальными файлами, с файлами, доступными по сети, с файлами, считанными с ленточного накопителя, или с файлами, прибывшими по именованному каналу.

Но ситуация начала меняться. Несмотря на то, что в Linux последовательный порт — это просто файл, у него имеются некоторые особые атрибуты, которые позволяют, например, задать скорость порта в бодах. И, что ещё хуже, некоторые программы слишком много «знали» о файлах и настоятельно требовали придерживаться определённых соглашений по их именованию. Поэтому, в теории, у пользователя должна была быть возможность создать сетевой сокет и подключить один из его концов к последовательному порту, а другой — к программе. После этого всё должно было нормально работать. Но это — в теории.

Переходник USB/последовательный порт

Практика, конечно, отличается от теории. В некоторых случаях, очень простых, это может и сработать. Для настройки вышеописанной схемы работы с последовательными портами можно воспользоваться утилитой socat (это — нечто вроде cat для сокетов). Но если программа, которую мы пытаемся таким образом обмануть, попробует, например, задать скорость порта в бодах, то у неё, вероятно, ничего не получится. А некоторые программы даже не распознают такой вот ненастоящий последовательный порт.

Подробности о socat

Программа socat напоминает волшебный кабель-переходник, который просто передаёт на выход всё, что поступает на его вход, и, кроме того, поддерживает передачу данных в обратном направлении. Программа может читать данные из файлов, из каналов, с различных устройств, из сокетов и из некоторых других мест. Например, может понадобиться создать простой TCP-прокси для перенаправления соединений с одного локального хоста на другой хост. С помощью socat решить эту задачу очень просто:

То, что получится в результате выполнения этой команды, поддерживает лишь одно соединение. Но socat можно настроить так, чтобы для новых соединений создавались бы форки, что позволяет обрабатывать множество запросов.

Проблема

Правда, если попытаться применить socat для работы с последовательным портом, то получившаяся конструкция вряд ли будет работать без множества дополнительных настроек. Но нужно это так часто, что существует несколько программ, способных нам в этом помочь. В большинстве Linux-дистрибутивов заработает программа ser2net , которая умеет преобразовывать последовательный порт в сокет. Если ser2net кому-то не подойдёт — можно воспользоваться Python-кодом, который имеется среди примеров использования библиотеки pyserial . Правда, та версия pyserial , которая установлена в используемом дистрибутиве, может оказаться слишком старой для поддержки этого кода. Если это так и есть — нужно установить эту библиотеку в обход системного менеджера пакетов, например, воспользовавшись pip .

Далее я исхожу из предположения о том, что для работы с последовательным портом используется ser2net .

Эта утилита обычно устанавливается в виде системной службы, для её настройки можно прибегнуть к редактированию файла /etc/ser2net.conf . Я убрал из этого файла всё, что там было, и добавил туда описания двух нужных мне последовательных портов, указав, кроме прочего, их желаемую скорость в бодах:

После редактирования этого файла сервис надо перезапустить (вероятно, тут подойдёт команда systemctl restart ser2net ; а если она не сработает в первый раз — её стоит попробовать выполнить ещё раз, так как иногда она пытается запустить новую копию сервиса ещё до того, как предыдущая копия полностью завершила работу).

Для целей отладки может понадобиться остановить сервис и запустить его, включив возможность вывода отладочных сообщений:

Но, в любом случае, после того, как сервер заработает, указанные порты (7777 и 7778 в моём конфигурационном файле) будут работать как соответствующие последовательные порты.

Хочу сделать тут несколько замечаний. Если вы пытаетесь проделать это с 3D-принтером, и если у вас запущено нечто вроде Octoprint, то вам понадобится или закрыть программу, или найти другой способ «отвязать» её от принтерного порта до выполнения вышеописанных настроек. Это применимо к любой программе, удерживающей последовательный порт, который нам нужно открыть. В случае с некоторыми стандартными портами нужно удостовериться в том, что механизм входа в систему не удерживает порт открытым, ожидая пользователя. То, как именно это всё заработает, зависит от конкретной системы. То же самое относится и к файрволу. Если прослушивается порт 7777 и при этом используется файрвол, нужно настроить его так, чтобы он разрешал бы подключения к этому порту. При этом надо помнить о том, что для открытия портов с небольшими номерами обычно нужны root-права.

Клиент

На стороне клиента можно использовать socat , но некоторые программы поймут, что перед ними — не настоящий последовательный порт. Правда, никто не мешает попробовать такую команду:

Читайте также:  Linux nvidia gpu change fan speed

Кое-какие программы, правда, ищут устройства лишь в папке /dev . Если это именно так — понадобится запустить socat с root-правами (воспользовавшись sudo ), а затем нужно будет настроить /dev/ttyNET0 , дав разрешения на чтение и запись (например — sudo chmod 666 /dev/ttyNET0 ).

Тестирование

Если созданный механизм выглядит работоспособным, я, всё равно, не рекомендую сразу же пробовать пользоваться им в программе, для которой он создавался. Советую сначала протестировать его, воспользовавшись чем-то вроде picocom . После запуска socat , например, на клиентской машине должна нормально отработать такая команда:

Утилита picocom может обмениваться данными по сети с использованием виртуального последовательного порта

Если вы попробуете сделать нечто подобное, то вам, понятно, нужно будет указать актуальные для вашей системы имя и скорость порта. У вас, в результате, должна появиться возможность обмениваться данными с удалённым устройством. Если это не получится — нужно разобраться с причинами неполадки до того, как виртуальный порт можно будет использовать в обычной программе. Если в основе вашего последовательного устройства не лежит передача текста, то, возможно, вам больше повезёт с cutecom. Но, к сожалению, эта программа знает о том, что виртуальный последовательный порт — это порт поддельный, и не позволит его выбрать. Правда, программа это опенсорсная, поэтому не слишком сложно будет создать её собственную версию, которая примет любое нужное имя устройства. Конечно, есть и другие варианты. Например — выбрать ненастоящий последовательный порт позволит gtkterm .

Если в ходе тестирования возникнет ошибка протокола, может оказаться так, что последовательный порт перемещён (например — был /dev/ttyUSB0 , а потом стал /dev/ttyUSB1 ), или окажется, что неправильно настроена скорость порта. Сообщения об ошибках не особенно информативны, но при поиске проблем стоит помнить об опции -d программы ser2net .

Документация программы ttynvt устроена просто, но отличается точностью

Когда же дело дойдёт до использования виртуального последовательного порта в обычной программе, всё может заработать как надо. Но может появиться ошибка, или, в некоторых случаях, программа может не позволить выбрать соответствующий файл, так как он не ассоциирован с настоящим последовательным портом. Иногда бывает так, что в чём-то просто не везёт. Правда, тут может пригодиться более интеллектуальный клиент, который знает толк в последовательных портах. Например — ttynvt. Программу, возможно, придётся собрать из исходников, но сделать это очень просто. Она зависит от libfuse , но больше ей ничего особенного не нужно.

После того, как программа будет готова к работе — попробуйте нечто вроде такой команды:

Будет создано устройство /dev/ttyNET0 (отсюда — и потребность в root-правах). В моей системе у нового устройства были права на чтение и запись root-уровня, оно входило в группу dialout . Если вы воспользуетесь этой программой, то вам, возможно, нужно будет проверить и настроить под себя её разрешения.

Перед использованием в обычной программе то, что получилось, опять же, рекомендуется протестировать с помощью picocom . А во время проведения теста стоит скрестить пальцы и надеяться на удачу.

Почему всё так нескладно?

Я, когда связался с последовательными портами, хотел сделать так, чтобы программа Lightburn для лазерного резака работала бы на мощной машине с использованием удалённого рабочего стола. Мне хотелось, чтобы резак был бы подключён к USB-порту на простом локальном компьютере, и чтобы программа взаимодействовала бы с поддельным портом в более серьёзной системе.

Но, к сожалению, сейчас ситуация такова, что Lightburn — программа слишком умная, которая не ведётся на мои хитрости и не хочет показывать мне виртуальные последовательные порты. И нет известного мне способа заставить её использовать имя файла, выбранное мной. Поэтому я даже не могу проверить то, как она работает с виртуальным портом. Правда, мне удалось протестировать подобные порты с некоторыми другими G-Code-программами. И всё это работало хорошо. Я сообщил о моей проблеме разработчикам Lightburn. Возможно, в тот момент, когда вы это читаете, проблема уже решена.

Парадигма «всё — это файл» чрезвычайно мощна. Но, к сожалению, с каждым годом она всё меньше соответствует реальному положению дел. Это создаёт всё больше препятствий тем, кто хочет сделать в Linux что-то интересное и не совсем обычное. Но, как это обычно бывает в Linux, желаемого, всё равно, как-то можно достичь. Я не сомневаюсь в том, что смог бы отследить вызовы, которые выполняет Lightburn для открытия порта, а после этого смог бы найти способ обмануть программу и подсунуть ей последовательный клиент. Но я надеюсь, что делать этого мне не придётся.

Возникала ли у вас необходимость в работе с виртуальными последовательными портами в Linux?

Источник

Оцените статью